本文将介绍Nacos作为注册中心和配置中心是如何使用的。首先简单了解下Nacos架构:
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。
服务注册中心,它是服务,其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
从上述定义可以知道,服务/一组服务在启动时会将自身注册到服务注册中心的服务注册表当中,当其它服务请求另一个服务时会先查找服务注册表找到对应可用实例,再发起对可用实例的服务调用。
不多展开,本文以一个SpringCloud服务端工程+一个SpringCloud客户端工程,同时启动2个服务端实例,客户端采用RestTemplate负载均衡调用服务端的方式演示效果。关于Nacos的集群简易环境搭建见文末链接。
(1)整体工程结构:
springcloud-nacos:父pom工程,主要定义公用的maven依赖,如springboot,springcloud,springcloud-alibaba等。
nacos-spring-cloud-provider:服务端工程,提供服务。
nacos-spring-cloud-comsumer:客户端工程,接收浏览器请求获取服务端服务,响应服务端数据。
(1)springcloud-nacos:父pom工程的maven文件pom.xml定义:
4.0.0
com.alibaba.example
nacos-spring-cloud-example
pom
0.2.0-SNAPSHOT
org.springframework
spring-webmvc
5.0.8.RELEASE
org.springframework
spring-core
5.0.8.RELEASE
javax.servlet
javax.servlet-api
3.0.1
provided
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
provided
com.alibaba
fastjson
1.2.31
com.fasterxml.jackson.core
jackson-databind
2.9.1
org.apache.maven.plugins
maven-compiler-plugin
3.5.1
1.7
1.7
UTF-8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
/
9090
UTF-8
tomcat7
true
(2)nacos-spring-cloud-provider工程:
pom.xml:
引入spring-boot-starter-web和spring-cloud-starter-alibaba-nacos-discovery、
nacos-client,注意还要额外引入hibernate-validator用于替换springbootweb内部的高版本兼容包。
核心依赖为spring-cloud-starter-alibaba-nacos-discovery
nacos-spring-cloud-example
com.alibaba.example
0.2.0-SNAPSHOT
4.0.0
nacos-spring-cloud-provider
org.springframework.boot
spring-boot-starter-web
org.hibernate
hibernate-validator
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.nacos
nacos-client
com.alibaba.nacos
nacos-client
org.hibernate
hibernate-validator
5.1.0.Final
org.springframework.boot
spring-boot-maven-plugin
repackage
maven-compiler-plugin
1.8
1.8
application.properties:
主要声明注册中心的集群地址spring.cloud.nacos.discovery.server-addr。
注意在集群模式下这里一定要配置多个,否则启动会报错。
server.port=8070
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:3333,127.0.0.1:4444,127.0.0.1:5555
NacosProviderApplication:
主要定义要提供的服务方法,同时开启服务注册。核心是添加@EnableDiscoveryClient注解
package com.alibaba.nacos.example.spring.cloud;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@Value("${server.port}")
private int port;
@RestController
class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string + ",port:"+port;
}
}
}
以上就创建好了SpringCloud的服务端,在IDEAJ设置Edit Configuration,勾上Allow parallel run,启动一个服务端实例后,修改applicaiton.properties配置文件的port端口由8070改为8071继续启动该服务,这样就同时启动了2个服务端的服务,端口分别为8070和8071。
启动后,可以在Nacos看到两个服务:
(3)nacos-spring-cloud-consumer工程:客户端工程既完成向Nacos注册中心的注册,也实现了获取Nacos配置中心的功能。代码如下:
pom.xml:
nacos-spring-cloud-example
com.alibaba.example
0.2.0-SNAPSHOT
4.0.0
nacos-spring-cloud-comsumer
2.0.0.RELEASE
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.hibernate
hibernate-validator
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
${spring-cloud-netflix.version}
org.springframework.cloud
spring-cloud-starter-openfeign
${spring-cloud-openfeign.version}
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.nacos
nacos-client
com.alibaba.nacos
nacos-client
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-config
0.2.1.RELEASE
org.hibernate
hibernate-validator
5.1.0.Final
org.springframework.boot
spring-boot-maven-plugin
repackage
maven-compiler-plugin
1.8
1.8
application.properties:
server.port=8084
spring.cloud.nacos.discovery.server-addr=127.0.0.1:3333,127.0.0.1:4444,127.0.0.1:5555
bootstrap.yml:
spring:
application:
name: consumer
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:3333,127.0.0.1:4444,127.0.0.1:5555
bootstrap:
enable: true
log:
enable: true
namespace: aad916e5-78d3-40a6-9bd6-e2cfa69edbd3
group: PROD_GROUP
file-extension: yaml
ext-config[0]:
data-id: consumer-dev.yaml
refresh: true
NacosComsumerApplication:
package com.alibaba.nacos.example.spring.cloud;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
*/
@SpringBootApplication(scanBasePackages={"com.alibaba.nacos"})
@EnableDiscoveryClient
public class NacosConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConsumerApplication.class, args);
String useLocal = applicationContext.getEnvironment().getProperty("com.useLocal");
System.err.println("useLocal:"+useLocal);
}
}
TestController:
package com.alibaba.nacos.example.spring.cloud.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@RefreshScope //实现配置自动更新
public class TestController {
@Resource
private RestTemplate restTemplate;
@Value("${com.useLocal}")
private String useLocalCache;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
@RequestMapping("/get")
public String get() {
return useLocalCache;
}
}
注意:客户端向Nacos注册服务,和服务端一样只需要执行nacos.discovery.server-addr,加上@EnableDiscoveryClient即可。
在客户端请求服务端的方法中,使用restTemplate负载均衡方式调用http://service-provider/echo/服务。
客户端启动后,在Nacos控制台服务列表可以看到注册后的客户端实例。
通过浏览器多次访问http://localhost:8084/echo/hello,可以看到客户端通过负载均衡方式请求到不同端口的服务端上:
Nacos配置中心
我们知道工程的配置文件一般放在bootstrap.properties或application.properties文件中,我们想要修改某个配置时时常需要修改配置文件,然后还需要重新打包工程并发布,过程非常繁琐,对于微服务工程很多的时候这种运维工作更是难受。
那么Nacos配置中心就能很好满足动态配置获取的多工程配置隔离的需求了。客户端从配置中心获取动态配置,则需要在bootstrap启动文件中声明nacos.config.server-addr配置中心地址,以及命名空间namespace、组group、文件后缀file-extension等属性。
本例中见bootstrap.yml文件的配置,配置好后再Nacos客户端的配置管理新增在线配置文件。注意文件的命名有指定规范,规范见官网说明。我们根据指定的命名规范创建一个配置文件,配置内容填入样例com.useLocal: 1234560000,发布即可:
上面的配置好后,客户端工程启动,就可以自动获取到com.useLocal: 1234560000配置并加载到环境中了。
接下来怎么体现这个自动更新配置呢,我们在TestController上要加上注解@RefreshScope //实现配置自动更新。然后在Nacos控制台重新编辑这个配置,修改刚才的样例配置内容为com.useLocal: 123。重新发布:
这样就自动更新了配置,我们在浏览器再次访问http://localhost:8084/get就能看到浏览器输出最新的配置了。
本文样例代码地址:
springcloud-nacos-Java文档类资源-CSDN下载
Nacos Win7集群环境搭建:
Nacos注册中心/配置中心 WIN7集群配置介绍_喜欢火影的木易杨的博客-CSDN博客_nacos配置中心集群