微服務注冊中心nacos學習:先嘗試使用它,然后擼它源碼搞懂它。
在這里整理一下自己之前集成nacos的內容。
我的github地址:https://github.com/mrxiaobai-wen/springcloud_study.git
前置條件:下載nacos並安裝啟動。
服務提供者集成
創建一個Spring Cloud項目,即nacos-server-spring-cloud。
引入Nacos的依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置nacos連接
bootstrap.yml配置內容:
server:
port: 8021
spring:
application:
name: nacos-server-spring-cloud
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
config:
server-addr: http://localhost:8848
file-extension: yaml
在application.yml中添加一個ceshi.version配置,用於后面測試nacos配置中心:
ceshi:
version: dev
創建啟動類
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigurationProperties
public class NacosServerSpringCloudApplication {
@Resource
private ConfigBean configBean;
public static void main(String[] args) {
SpringApplication.run(NacosServerSpringCloudApplication.class, args);
}
@RestController
class EchoController {
@RequestMapping(value = "/server/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string + " 當前版本:" + configBean.getVersion();
}
}
}
@ConfigurationProperties("ceshi")
@Component
public class ConfigBean {
public String version;
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
就這樣,啟動上面的NacosServerSpringCloudApplication后,就可以在本地nacos服務列表中查看到當前服務了,然后在nacos配置中心里面新建一個nacos-server-spring-cloud.yml文件,變更發布ceshi.version的值,然后訪問localhost:8021/server/echo/{string}就可以看到變更的內容了。
這樣就簡單的完成了服務注冊和配置動態管理。
采坑
我在最開始的時候,將bootstrap.yml的內容放在application.yml中,然后在配置中心一起發布,但是配置變更一直沒有生效。然后經過一番摸索后,拆成了bootstrap.yml和application.yml兩個配置文件后,配置動態變更生效了。
Spring Cloud獲取數據的時候,其dataId的拼接格式為:${prefix} - ${spring.profiles.active} . ${file-extension}。其中prefix默認為spring.application.name的值,如果配置了多環境,spring.profiles.active即為配置的環境的值。
服務消費者集成
創建一個Spring Cloud項目,即nacos-consumer-spring-cloud。
依賴與上面一致。application.yml配置也與上面一致。
創建啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerSpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerSpringCloudApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/consumer/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://nacos-server-spring-cloud/server/echo/" + str, String.class);
}
}
}
然后將上面的nacos-server-spring-cloud和這個消費服務一起啟動。然后訪問當前的消費服務,訪問/consumer/echo/{str}接口,可以看到請求最終轉到了上面的那個服務中。
而我們的請求地址是http://nacos-server-spring-cloud/server/echo/,這就是注冊中心的作用,我們不用關注server服務的具體地址,只是請求nacos-server-spring-cloud即可。