SpringCloud Nacos使用和配置,SpringCloud Nacos 服務注冊中心配置使用


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM