SpringCloud Nacos使用和配置,SpringCloud Nacos 服務注冊中心配置使用
================================
©Copyright 蕃薯耀 2021-03-26
https://www.cnblogs.com/fanshuyao/
一、SpringCloud Nacos概述
Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。
Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平台。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務范式、雲原生范式) 的服務基礎設施。
官方地址:
https://nacos.io/zh-cn/index.html
官方文檔:
https://nacos.io/zh-cn/docs/what-is-nacos.html
Spring官方文檔:
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html
Nacos 的關鍵特性包括:
1、服務發現和服務健康監測
2、動態配置服務
3、動態 DNS 服務
4、服務及其元數據管理
Nacos架構圖
二、SpringCloud nacos下載
nacos全部版本下載地址
https://github.com/alibaba/nacos/releases
當前最新穩定版本是:nacos-server-1.4.1.zip,nacos-server-2.0.0-BETA.zip現在還是測試版本
Windows下載地址:
https://download.fastgit.org/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.zip
Linux下載地址:
https://download.fastgit.org/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz
三、啟動nacos
解壓nacos-server-1.4.1.zip,進行目錄(D:\0soft\nacos-server-1.4.1\nacos\bin),雙擊:startup.cmd 進行啟動
nacos啟動報錯:
java.io.IOException: java.lang.IllegalArgumentException: db.num is null
原因是:
nacos默認是集群方式的,要配置mysql,利用Mysql共享配置信息
解決方案:
啟動方式一(單機模式),建議使用這種方式:
在bin路徑(D:\0soft\nacos-server-1.4.1\nacos\bin)打開cmd命令窗口,輸入下面的命令啟動:
startup.cmd -m standalone
關閉:
打開cmd命令窗口,輸入下面的命令:
cmd shutdown.cmd
或者雙擊shutdown.cmd關閉nacos。
訪問nacos管理后台,用瀏覽器打開下面的地址:
http://127.0.0.1:8848/nacos
登錄名:nacos
密碼:nacos
啟動方式二(單機模式):
復制一個startup.cmd(備份),用編輯器打開:startup.cmd,找到下面的命令:
set MODE="cluster"
修改成單機模式:
set MODE="standalone"
然后雙擊:startup.cmd重新啟動,成功。
這種方式,就是不用輸額外的啟動參數
啟動方式三(Mysql單機模式):需要創建數據庫(僅支持Mysql,最好是5.7版本,5.5版本執行腳本文件時,默認時間會有問題)
Nacos使用Mysql5.5版本問題:
錯誤代碼: 1067
Invalid default value for 'gmt_create'
Windows Mysql5.7安裝和配置,Windows 安裝多個Mysql,見:
https://www.cnblogs.com/fanshuyao/p/14557184.html
創建nacos數據庫:
數據庫名:nacos
字符集編碼:utf8mb4
排序規則:utf8mb4_general_ci
創建表,執行nacos-mysql.sql文件的sql腳本
腳本的位置在:
D:\0soft\nacos-server-1.4.1\nacos\conf\nacos-mysql.sql
修改D:\0soft\nacos-server-1.4.1\nacos\conf\application.properties配置文件:
默認是:
#spring.datasource.platform=mysql ### Count of DB: #db.num=1 ### Connect URL of DB: #db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC #db.user.0=nacos #db.password.0=nacos
修改后:
spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3307/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=root
Nacos使用配置數據庫的使用集群方式報錯:
nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
Caused by: com.alibaba.nacos.api.exception.NacosException: java.net.UnknownHostException: jmenv.tbsite.net
Caused by: java.net.UnknownHostException: jmenv.tbsite.net
雖然配置了數據庫,但還是不能以集群的方式啟動,還是要在bin路徑(D:\0soft\nacos-server-1.4.1\nacos\bin)打開cmd命令窗口,輸入下面的命令啟動:
startup.cmd -m standalone
那為什么要使用Mysql數據呢?
原因是:
Nacos默認是使用了嵌入式數據庫Derby,所以保存了用戶相關的配置。但如果Nacos使用了集群,每個Nacos應用都有自己獨立的Derby數據庫,會造成數據庫中配置的信息不一致。所以必須使用Mysql替換,保存配置信息完全一致。
修改了數據庫的連接配置,只是使用了Mysql數據庫替換了Nacos自帶的嵌入式數據庫Derby,所有的配置都保存到了mysql數據庫中。
所以最終還是得以單機模式(standalone)啟動。
至於Nacos集群模式怎樣安裝啟動?見:
https://www.cnblogs.com/fanshuyao/p/14577977.html
四、SpringCloud Nacos Provider服務提供者
使用2個服務提供者,這樣可以測試負載均衡:
springCloud-8801-nacos-provider
springCloud-8802-nacos-provider
1、pom.xml引入依賴
<properties> <spring-cloud.version>Hoxton.SR10</spring-cloud.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <!-- <version>2.2.4.RELEASE</version> --> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2、application.properties配置文件修改
server.port=8801 spring.application.name=SPRING-CLOUD-NACOS-SERVICE #配置nacos服務地址,通過 Spring Cloud 原生注解 @EnableDiscoveryClient 開啟服務注冊發現功能: spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、啟動類
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @EnableDiscoveryClient:通過 Spring Cloud 原生注解 @EnableDiscoveryClient 開啟服務注冊發現功能 * */ @SpringBootApplication @EnableDiscoveryClient public class SpringCloud8801NacosProviderApplication { public static void main(String[] args) { SpringApplication.run(SpringCloud8801NacosProviderApplication.class, args); } }
4、服務調用接口類
import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.lqy.springCloud.Result; @RestController @RequestMapping("/nacos") public class ProviderController { @Value("${spring.application.name}") private String serviceName; @Value("${server.port}") private String serverPort; @RequestMapping(value="/test", produces = MediaType.APPLICATION_JSON_VALUE) public Result test() { return Result.ok(serverPort); } @RequestMapping(value="/get/{text}", produces = MediaType.APPLICATION_JSON_VALUE) public Result get(@PathVariable(value = "text") String text) { return Result.ok("端口=" + serverPort + ",text=" + text); } }
五、SpringCloud Nacos Consumer服務消費者
服務消費者只需要一個:
springCloud-8805-nacos-web
1、pom.xml引入依賴
依賴和服務提供者一樣。
2、application.properties配置文件修改
server.port=8805 spring.application.name=SPRING-CLOUD-NACOS-CONSUMER #配置nacos服務地址,通過 Spring Cloud 原生注解 @EnableDiscoveryClient 開啟服務注冊發現功能: spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #服務提供者的服務名,接口調用需要用到 my.nacos.service.name=SPRING-CLOUD-NACOS-SERVICE
3、啟動類
@EnableDiscoveryClient
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 通過 Spring Cloud 原生注解 @EnableDiscoveryClient 開啟服務注冊發現功能: * */ @SpringBootApplication @EnableDiscoveryClient public class SpringCloud8805NacosWebApplication { public static void main(String[] args) { SpringApplication.run(SpringCloud8805NacosWebApplication.class, args); } }
4、服務調用接口類
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import com.lqy.springCloud.Result; @RestController @RequestMapping("/web") public class WebController { //消費者自己的服務名 @Value("${spring.application.name}") private String serviceName; @Value("${server.port}") private String serverPort; //服務提供者的服務名 @Value("${my.nacos.service.name}") private String myNacosServiceName; @Autowired private RestTemplate restTemplate; @RequestMapping(value="/test", produces = MediaType.APPLICATION_JSON_VALUE) public Result test() { return Result.ok(serverPort); } @RequestMapping(value="/get/{text}", produces = MediaType.APPLICATION_JSON_VALUE) public Result get(@PathVariable(value = "text", required = false) String text) { return restTemplate.getForObject("http://" + myNacosServiceName + "/nacos/get/" + text, Result.class); } }
5、RestTemplate配置類
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestConfig { //@LoadBalanced實現負載均衡,有多個服務提供者,一定要使用,不然會報錯 @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
六、【消費者】調用【服務提供者】的接口測試
Nacos整合了Ribbon,默認是輪詢負載均衡算法
http://127.0.0.1:8805/web/get/a
返回結果:
{ "result": true, "timestamp": "2021-03-19 15:53:24", "msg": "操作成功。", "datas": "端口=8802,text=a" }
(時間寶貴,分享不易,捐贈回饋,^_^)
================================
©Copyright 蕃薯耀 2021-03-26
https://www.cnblogs.com/fanshuyao/