Nacos作為注冊中心和配置中心


關注我更多精彩文章第一時間推送給你

安裝Nacos

官網

安裝啟動后Nacos訪問地址是 127.0.0.1:8848/nacos/index.html

登錄名和密碼默認都是 nacos

使用Nacos作為注冊中心

版本對於自己去了解,我這里用的boot 2.3.2.RELEASE版本,spring cloud alibaba 2.2.5.RELEASE版本

<!--這里是我引入的依賴-->
<!--注冊中心的依賴,服務的注冊與發現-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  <version>2.2.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

接下來在入口類的上面加上注解@EnableDiscoveryClient,實現服務的注冊與發現。

/**
 * 開啟Spring Cloud的服務注冊與發現
 */
@EnableDiscoveryClient
@SpringBootApplication
@RestController
public class NacosServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosServerApplication.class, args);
    }


    @GetMapping("/hello")
    public String hello(@RequestParam String name) {
        return "Hello " + name;
    }

}

配置文件application.yml中配置注冊中心地址和服務注冊到注冊中心的名稱

server:
  port: 7001
# 注冊到注冊中心服務的名稱
spring:
  application:
    name: nacos-server
  # nacos 注冊中心地址
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

啟動后去Nacos注冊中心查看,可以看到配置的服務注冊到了注冊中心

圖1

介紹三種服務的消費方式

這里不介紹RPC調用,分別介紹 spring 提供的 RestTemplate、WebClient 還有 Netflix 封裝的 Feign一共三種方式。

RestTemplate 方式

首先新建一個新的服務用來調用nacos-server服務,新建的服務命名為nacos-client-common,配置關系和nacos-server一樣

@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class NacosClientCommonApplication {

    // 需要@Autowired注入
    @Autowired
    private RestTemplate restTemplate;
  
  
  /**
     * 2. Spring Cloud中對RestTemplate做了增強,只需要稍加配置,就能簡化之前的調用方式
     * @return
     */
    @GetMapping("/test1")
    public String test1() {
        return restTemplate.getForObject("http://nacos-server/hello?name=kangkang", String.class);
    }

    /**
     * 在定義RestTemplate的時候,增加了@LoadBalanced注解,而在真正調用服務接口的時候,原來host部分是通過手工拼接ip和端口的,
     * 直接采用服務名的時候來寫請求路徑即可。在真正調用的時候,Spring Cloud會將請求攔截下來,然后通過負載均衡器選出節點,
     * 並替換服務名部分為具體的ip和端口,從而實現基於服務名的負載均衡調用。
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

WebClient 方式

WebClient 是 Spring5 響應式編程中類似 RestTemplate 調用服務的方式

# 需要引入依賴支持響應式編程
<!--用於支持WebClient代替RestTemplate調用服務-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class NacosClientCommonApplication {
  
  	@Autowired
    private WebClient.Builder webClientBuilder;
  
    /**
     * RestTemplate和 WebClient都是 Spring 自己封裝的工具
     * @return
     */
    @GetMapping("/test2")
    public Mono<String> test2() {
        return webClientBuilder.build()
                .get()
                .uri("http://nacos-server/hello?name=yunqing")
                .retrieve()
                .bodyToMono(String.class);
    }


    /**
     * 依賴 spring-boot-starter-webflux
     * WebClient是Spring 5中最新引入的,可以將其理解為響應式版的RestTemplate。
     * @return
     */
    @Bean
    @LoadBalanced
    public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
    }
}

Feign 方式

<!--引入依賴-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
  <version>2.2.6.RELEASE</version>
</dependency>
// 加入下面這個注解,開始掃描 FeignClient 
@EnableFeignClients
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class NacosClientCommonApplication {
  	// 注入服務的接口,需要把服務的接口聲明在這個服務的項目中,實現還是在 nacos-server 中
  	@Autowired
    private FeignService feignService;
  
  	/**
     * 依賴 spring-cloud-starter-openfeign
     *
     * @return
     */
    @GetMapping("/test3")
    public String test3() {
        return feignService.hello("spring cloud");
    }
}

服務的接口 FeignServer

// 注解指定了這個接口調用服務的名稱
@FeignClient("nacos-server")
public interface FeignService {

    @GetMapping("/hello")
    String hello(@RequestParam String name);
}

Nacos作為配置中心

創建命名空間

首先需要在Nacos中新增兩個命名空間,devtest之后在每個命名空間下添加對應的配置。

圖2

如圖所示還有一個保留空間public這是默認存在的,接下來在配置管理配置列表中就可以看到三個命名空間,如下圖所示,我在dev命名空間創建了一個配置。

圖3

如何定位一個配置

  1. 首先由命名空間namespace定位是哪個命名空間的配置,必須使用命名空間id,不配置默認使用public命名空間
  2. 前綴prefix確定了配置的名稱,不配置默認為當前服務名稱,這里我配置的也是當前服務名稱
  3. 后綴file-extension確定了配置的后綴名,默認為properties,因為我的配置的Data Id創建為yaml格式的名為nacos-config.yaml所以這里的后綴需要寫出為yaml
  4. 分組group確定了配置的組名,默認組名為DEFAULT_GROUP
  5. 也可以通過spring.profile.active或者group進行多環境配置,但是更推薦使用namespace
  • bootstrap.yml
# 此處配置必須用 bootstrap.yml 或者 bootstrap.properties
spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml # dataId由應用名稱(name)加文件擴展名組成 nacos-config.yaml, 默認值為 properties
        group: DEFAULT_GROUP # 默認分組, 例如 DEV-GROUP  TEST-GROUP
        prefix: ${spring.application.name} # 前綴默認就是應用名稱,不用配置,這里配置出來方便理解
        namespace: 87d915fc-e1be-4d0e-8dbd-d3314ac47844  # 命名空間


server:
  port: 7007

到底配置了什么?

實際上就配置了一個kangqing.title

圖4

讀取配置詳情

讀取配置的目的是證明,通過配置中心添加的配置,能夠在應用中生效,被讀取到即能夠生效

<!-- 這個是配置中心的依賴 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
/**
 * 可以看到,這個例子中並沒有加入nacos的服務發現模塊,所以這兩個內容是完全可以獨立使用的
 *
 * 這個注解 @RefreshScope 主要用來讓這個類下的配置內容支持動態刷新,也就是當我們的應用啟動之后,修
 * 改了Nacos中的配置內容之后,這里也會馬上生效。
 */
@RefreshScope
@RestController
@SpringBootApplication
public class NacosConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigApplication.class, args);
    }

    /**
     * 注意這個冒號不能省略
     */
    @Value("${kangqing.title:}")
    private String title;

    @GetMapping("/test")
    public String hello() {
        return "result -> " + title;
    }

}

多配置加載

例如我現在已經加載了nacos-config.yaml的配置,我不想把所有配置寫到這一個文件中,於是我又在nacos中添加了mybatis-plus.yaml的配置,想要在應用中加載多個配置

方式一:

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 535d5ae5-de1e-443b-a0a7-68a34e52946d
        ext_config[0]:
          data-id: nacos-config.yaml
          group: DEFAULT_GROUP
          refresh: true
        ext_config[1]:
          data-id: mybatis-plus.yaml
          group: DEFAULT_GROUP
          refresh: true

方式二:

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 535d5ae5-de1e-443b-a0a7-68a34e52946d
        shared-configs:
          - nacos-config.yaml
          - mybatis-plus.yaml
        refresh-enabled: true

既然有多種配置方式,就存在優先級,最先的前綴后綴group定位的方式優先級最高,其次是方式一,最后是方式二,也就是方式二會被方式一覆蓋,方式一會被前后綴group的方式覆蓋。

  • 注:以上知識點均是本人基於單機版的nacos進行學習總結,並不適用於生產環境,生產環境請另行部署nacos集群和nacos數據持久化。

關注我更多精彩文章第一時間推送給你


免責聲明!

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



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