Nacos服务注册与配置中心
文章目录
1.什么是Nacos?
Nacos(Dynamic Naming and Configuration Service)Nacos就是注册中心+配置中心的组合。即Nacos = Eureka + config + Bus。他能替代Eureka做服务注册中心,替代Config做服务配置中心。
2.Nacos安装运行
上他的官网Release 1.1.4(Oct 24th, 2019) · alibaba/nacos (github.com)下载一个压缩包解压之后找到bin目录下找到startup.cmd打开能看到这个说明安装成功了。
然后访问他的web界面输入http://localhost:8848/nacos能看到这个登录界面说明访问成功了。
默认用户名密码都是nacos登录进去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKIGBB5e-1645366625852)(C:\Users\MICROSOFT\Pictures\博客图片\SpringCloud\Nacos\nacos主界面.png)]
来到这个界面这个就很贴心了配置管理,服务管理,集群管理都给你安排明白了。另外插句题外话,这个端口号设置的很灵性是大名鼎鼎的8848向成功的人生致敬!!!!!!
3.Nacos简单案例之注册中心
3.1Nacos服务提供者
为了防止每次新建一个Nacos相关的项目就得引入一个Nacos依赖所以我们可以直接在父pom中引入Nacos的相关依赖。后面子工程就不用引入了。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
然后新建一个子moudle在pom文件中其中引入Nacos注册中心相关依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
然后创建yml文件
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
#端口暴漏
management:
endpoints:
web:
exposure:
include: '*'
配置文件规定好端口号,服务名称,注册到localhost:8848这个注册中心里,然后management将端口暴露出来供以后监控。
然后主启动类上加上@EnableDiscoveryClient注解,业务类controller非常简单写一个接口返回端口号供测试使用。
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos,registry,serverPort:" + serverPort + "\t id" + id;
}
}
启动9001这个服务看看能不能把他注册进nacos里。
刷新一下点击服务列表能看到我们的服务,说明服务已经成功的注册进服务中心。
3.2Nacos服务消费者
建立一个服务消费者module然后pom文件和之前的一样。然后新建yml文件
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
service-url:
nacos-user-service: http://nacos-payment-provider
主启动类和上面一样需要加上@EnableDiscovery注解。然后业务类controller需要调用服务提供者的接口
@RestController
public class OrderNacosController {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id){
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id,String.class);
}
}
输入url:localhost:83/consumer/payment/nacos/7然后可以看到成功访问到服务提供者的接口
3.3Nacos自带的负载均衡
可以看出nacos依赖里面就包含了ribbon,所以nacos默认支持负载均衡。
为了验证nacos的负载均衡我们可以在新建一个9002服务提供者和9001一样。然后在消费者这边创建配置类,实现负载均衡的配置。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
然后启动9001,9002,83通过消费者访问服务提供者的接口
这次就变成了9002你再点一下就变成了9001来回交替轮询。
3.4Nacos服务注册中心的优点
Nacos服务注册中心既支持CP也支持AP,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如SpringCloud和Dubbo服务都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8s服务DNS服务则适用于CP模式。CP模式下则是支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
Nacos几乎做到了各种技术栈的全景覆盖。
4.Nacos简单案例之配置中心
首先新建一个module然后在pom文件中引入他的配置中心的依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
Nacos配置中心相比于Config+Bus来说不知道好了多少,他可以直接在Nacos界面上配置。
这个Data ID他的官网上是这样描述的
也就是说你得在你的moudle下添加几个配置文件,补充这几个配置项。因此我们在此module下要新建这两个配置文件bootstrap.yml,application.yml。
bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
application.yml
spring:
profiles:
active: dev
从上面的配置文件可以看出bootstrap.yml中的spring.application.name就是Data ID中的prefix,application.yml的spring.profiles.active就是spring.profiles.active,bootstrap.yml中的file-extension就是Data ID中的file-extension。所以我们的这个Data ID应该是nacos-config-client-dev.yaml
然后我们新建一个配置填上Data ID,配置格式选择YAML然后config注意格式。
点发布就能看到配置列表里新增了一个配置
一定要注意那个Data ID,dev之前一定是“-”不是“.",还有一定是yaml。
为了方便测试我们需要在module下面加入一个主启动类,一个controller。
@SpringBootApplication
@EnableDiscoveryClient//让注册中心发现并扫描该服务
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class,args);
}
}
@RestController
@RefreshScope//保证Nacos动态刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
然后打开3377这个服务,在url浏览器端访问3377。
nacos配置中心最牛逼的一点就是不用再像Config或Bus那样,还得手动通知这个通知那个的,只要你在controller类上加了@RefreshScope就能自动刷新,比如我现在把version改成2。我在访问这个接口能观察到马上就改了,非常痛快。
5.Nacos命名空间,分组,Data ID
Nacos默认的命名空间是public,Namespace主要用来实现隔离。比如说我们现在有三个环境:开发,测试,生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去。
Service就是微服务,一个Service可以包含多个Cluster集群,Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分,比方说为了容灾,将Service微服务分别部署在了不同地方的机房那么同一个地方的微服务可以互相调用可以提升性能。
5.1 Data ID配置
之前的Data ID是nacos-config-client-dev.yaml,这个dev就是application.yml里面的spring.profile.active如果我们把这个改成test环境然后再新增一个Data ID为test的配置即可切换环境为测试环境。
然后测试一下
5.2Group分组方案
要修改设置group我们需要在bootstrap.yml文件中添加group属性,然后在Nacos中配置group属性,Nacos的group和yml文件中的group要一致。你如果不指定group属性那就是一开始默认的DEFAULT_GROUP。
然后我们访问一下接口看看好不好使
结果是好使。
5.3Nacos命名空间NameSpace方案
可以看出这个命名空间里面有三个一个是默认的public你只能查看详情不能删除和编辑,后面两个是我自己建的一个是开发环境的(dev),一个是测试环境(test),对应的都有命名空间ID。
然后我们挑dev命名空间演示一下NameSpace,Group,Data ID三级配置。切换到该命名空间之下,创建两个分组一个用默认DEFAULT_GROUP,WJZ_GROUP。分别对他们进行配置。
然候修改bootstrap.yml文件
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
group: WJZ_GROUP #如果不是默认就有不然就没有
namespace: fbb37b9d-1a14-42e7-8f33-549c191ef9c2
访问这个命名空间下的,WJZ_GROUP组的,nacos-config-client-dev.yaml
现在我把yaml文件中group这个去掉然后再次访问
得到的就是DEFAULT_GROUP的这组的结果。