版本和依賴
SpringBoot、SpringCloud Alibaba、OpenFeign等存在版本對應關系,版本不匹配可能會出現問題。以如下以來的版本為例說明如何接入Nacos。
<dependencies>
<dependency>
<!--配置中心依賴-->
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--客戶端版本依賴-->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.0</version>
</dependency>
<!--注冊中心版本依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.6</version>
</dependency>
</dependencies>
接入注冊中心
服務注冊
接入注冊中需要的增加的依賴是spring-cloud-starter-alibaba-nacos-discovery,在第二節中已經給出。
注意?實例中SpringBoot 2.6.1 ?SpringCloud版本為2021.0.4.0,這兩個版本需要匹配。如果使用其他版本,可以從Spring Cloud 官方查詢匹配版本。
在本地創建服務提供者應用工程,然后添加依賴,并開啟服務注冊與發現功能,并將注冊中心指定為Nacos Server。 接入注冊中心需要在配置文件中增加相關配置,以yml文件為例,可以加在application-prod.yml中增加如下配置文件:
spring:
cloud:
nacos:
discovery:
username: ${_NAOCS_USERNAME}
password: ${_NAOCS_PASSWORD}
server-addr: ${_NACOS_SERVER_ADDRESS}
namespace: ${_NACOS_NAMING_NAMESPACE}
group: ${_NACOS_NAMING_GROUP}
以上配置中變量的實際值,可以通過環境變量的方式提供。環境變量可以在云容器引擎中配置。
除修改配置文件以外,需要在Spring Boot 項目的啟動類上增加@EnableDiscoveryClient注解。如下列代碼所示:
@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
修改配置文件后啟動應用。啟動成功后可以在控制臺頁面查看當前注冊的服務。
服務發現
除了服務注冊以外,注冊中心也提供服務發現的功能。Nacos服務發現可以使用RestTemplate和FeignClient兩個客戶端來調用注冊的服務。如下以使用FeignClient調用為例:
-
調用方增加依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.0.6</version> </dependency> -
在 Spring Boot 項目的啟動文件上添加 @EnableFeignClients 注解,開啟 OpenFeign,具體實現代碼如下:
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
- 最重要的一步,創建OpenFeign與服務提供者的調用接口,具體實現代碼如下:(示例這里調用的是自己的接口)
@FeignClient(name = "demo-test")
public interface OrderFeignService {
@GetMapping("/call/{name}")
String call(@PathVariable(value = "name") String name);
}
- 然后在controller中訪問接口,就可以獲得通過feign請求的的結果。
@RestController
@RequestMapping("feign")
public class DiscoverController {
@Resource
private IFeignClientService iFeignClientService;
@GetMapping("/echo/{message}")
public String getMessage(@PathVariable String message) {
return iFeignClientService.call(message);
}
}
- 最后請求feign/echo/{message}接口即可通過feign調call接口了。
至此通過FeignClient調用服務接口的流程就實現了。
接入配置中心
接入配置中需要的增加的依賴是spring-cloud-starter-alibaba-nacos-config,在第二節中已經給出。
接入配置中心需要在配置文件中增加相關配置,以yml文件為例,需要在bootstrap.yml中增加如下配置信息:
spring:
cloud:
nacos:
# config center
config:
username: ${_NAOCS_USERNAME}
password: ${_NAOCS_PASSWORD}
server-addr: ${_NACOS_SERVER_ADDRESS}
namespace: ${_NACOS_CONFIG_NAMESPACE}
group: ${_NACOS_CONFIG_GROUP}
prefix:
其中 namespace 默認值為空,也就是public命名空間,group 默認值為DEFAULT_GROUP, prefix屬性為非必要屬性,可以按照需要決定是否配置。配置文件中的值既可以配置真實值,也可以配置為從環境變量中獲取。
為了方便獲取和使用配置,可以自定義配置類。在自定義屬性類上需要增加注解,否則遠程配置更新是客戶端的配置不會自動更新。如下所示,定義了一個前綴為user的屬性類,自動綁定user前綴的屬性。
@RefreshScope
@ConfigurationProperties(prefix = "user")
public class User implements InitializingBean, DisposableBean {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
配置完成后,啟動應用。在啟動應用后查看啟動日志,會發現在一般情況下,應用監聽三個配置文件而不論這三個遠程配置文件是否存在。
[fixed-prod-IP_47588] [subscribe] +paas-default+prod
[fixed-prod-IP_47588] [add-listener] ok, tenant=prod, dataId=, group=paas-default, cnt=1
[Nacos Config] Listening config: dataId=, group=paas-default
[fixed-prod-IP_47588] [subscribe] -prod.properties+paas-default+prod
[fixed-prod-IP_47588] [add-listener] ok, tenant=prod, dataId=-prod.properties, group=paas-default, cnt=1
[Nacos Config] Listening config: dataId=-prod.properties, group=paas-default
[fixed-prod-IP_47588] [subscribe] .properties+paas-default+prod
[fixed-prod-IP_47588] [add-listener] ok, tenant=prod, dataId=.properties, group=paas-default, cnt=1
[Nacos Config] Listening config: dataId=.properties, group=paas-default
默認情況下,監聽的配置文件的dataId={prefix}-prefix?{spring.profile.active}.${file-extension}。
其中profix默認為${spring.application.name}。
file-extension表示配置的類型,默認為properties。
如果沒有指定spring.profile.active,那么dataId就變成了profix.{profix}.profix.{file-extension}。
啟動時會發現啟動日志中會打出多個:
-
${prefix} -
${prefix}?{spring.profile.active} -
${prefix}?{spring.profile.active}.${file-extension}
說明其實是可以匹配配置中心中配置的多條配置名稱。匹配優先級是:3>2>1,精確匹配。
通過 控制臺更新配置,在應用端可以接收到更新的推送。如果服務端同時存在多個監聽的配置,則當更新高優先級的配置時,客戶端才會接收到更新。
客戶端接收到更新推送,變更為最新的值。至此,說明接入配置中心成功,配置可以動態更新了。