關注我更多精彩文章第一時間推送給你
安裝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注冊中心查看,可以看到配置的服務注冊到了注冊中心
介紹三種服務的消費方式
這里不介紹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中新增兩個命名空間,dev
和 test
之后在每個命名空間下添加對應的配置。
如圖所示還有一個保留空間public
這是默認存在的,接下來在配置管理
的配置列表
中就可以看到三個命名空間,如下圖所示,我在dev
命名空間創建了一個配置。
如何定位一個配置
- 首先由
命名空間namespace
定位是哪個命名空間的配置,必須使用命名空間id,不配置默認使用public
命名空間 前綴prefix
確定了配置的名稱,不配置默認為當前服務名稱,這里我配置的也是當前服務名稱后綴file-extension
確定了配置的后綴名,默認為properties
,因為我的配置的Data Id
創建為yaml
格式的名為nacos-config.yaml
所以這里的后綴需要寫出為yaml
分組group
確定了配置的組名,默認組名為DEFAULT_GROUP
- 也可以通過
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
讀取配置詳情
讀取配置的目的是證明,通過配置中心添加的配置,能夠在應用中生效,被讀取到即能夠生效
<!-- 這個是配置中心的依賴 -->
<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數據持久化。