Nacos可以直接提供注册中心(Eureka)+配置中心(Config)比之前的Eureka更加方便,不需要在自己做配置。Nacos Discovery 帮助自动将服务注册到 Nacos 服务器,Nacos 服务器会跟踪服务并动态刷新服务列表。此外,Nacos Discovery 将服务实例的一些元数据,如主机、端口、健康检查 URL、主页等注册到 Nacos。
一、服务器注册(服务提供者)
1)创建项目,引入依赖
使用maven聚合项目进行创建
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)修改配置文件
server:
port: 8001
spring:
application:
name: nacos-provider
cloud:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoint:
web:
exposure:
include:'*'
3) 启动类 添加注解 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient//加此注解
public class CloudaNacos9001Application {
public static void main(String[] args) {
SpringApplication.run(CloudNacos9001Application.class, args);
}
}
4)启动nacos,再启动项目,登陆nacos进行验证
端口号为8001的服务注册到了nacos中
5)按照以上步骤,创建一个端口号为9002的服务
配置文件
server:
port: 8002
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoint:
web:
exposure:
include:'*'
启动项目,刷新nacos,可以看到有两台服务器注册
二、消费者服务器注册
1)创建项目,端口号为8308
2)配置文件
server:
port: 8083
spring:
application:
name: nacos-consumer
cloud:
discovery:
server-addr: 127.0.0.1:8848
3)启动类
@SpringBootApplication
@EnableDiscoveryClient
public class CloudConsumerNacos8308Application {
public static void main(String[] args) {
SpringApplication.run(CloudConsumerNacos8308Application.class, args);
}
}
4)刷新nacos
三、负载均衡
Nacos已整合Ribbon,Ribbon 是一个基于HTTP和TCP客户端负载均衡器,它虽然只是一个工具类库,它却是每一个微服务的基础设施,对于服务间调用、API网关请求转发都需要经过Ribbon负载均衡来实现。总体来说,Ribbon的主要作用是:从注册服务器端拿到对应服务列表后以负载均衡的方式访问对应服务。
1)远程访问使用RestTemplate
在服务消费者中配置RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
//访问
restTemplate.getForObject(arg1,arg2,arg3...);
第一个参数url表示被调用的目标Rest接口位置
1. url的第一部分是在Nacos中注册的服务提供者名称,如果多个服务提供者注册相同名称,Ribbon会自动寻找其中一个服务提供者,并且调用接口方法。这个就是负载均衡功能。
2. url后半部是控制器的请求路径。
第二个参数是返回值类型
JavaBean类型或者JavaBean数组类型,如果控制器返回的是List集合,需要使用数组类型接收。
第三个参数是可变参数
是传递给url的动态参数,使用参数时候需要在url上需要使用{1}、{2}、{3}进行参数占位,这样传递的参数就会自动替换占位符。
2)8001和8002对外提供接口(业务代码同)
@RestController
public class DemoController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/test")
public String getServerPort(){
return "Hello Nacos Discovery"+serverPort;
}
}
3)消费者访问
- 消费者配置文件添加 要访问的微服务名称
server:
port: 8083
spring:
application:
name: nacos-consumer
cloud:
discovery:
server-addr: localhost:8848
# 消费者将要去访问的微服务名称(注册成功的Nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-provider
- 启动类上配置restTemplate-远程调用
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 在8083的消费者上来通过Ribbon来自动的负载均衡调用9001或者9002的服务提供者
@RestController
public class DemoController {
@Resource
private RestTemplate restTemplate;
/**
* 消费者去访问具体服务,这种写法可以实现
* 配置文件和代码的分离
*/
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "consumer/nacos")
public String getDiscovery(){
System.err.println(serverURL);
return restTemplate.getForObject(serverURL+"/test",String.class);
}
}
4)访问http://localhost:8308/consumer/nacos
结果:Hello Nacos Discovery8001/8002(负载均衡切换显示)
四、配置中心
1、创建项目,pom文件引入依赖
服务端口号为3377
<dependency>
<groupId> com.alibaba.cloud </groupId>
<artifactId> spring-cloud-starter-alibaba-nacos-config </artifactId>
</dependency>
2、yml配置
要注意的是这里我们要配置两个,因为Nacos同SpringCloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
分别要配置的是,这里bootstrap.yml配置好了以后,作用是两个,第一个让服务注册到Nacos中,第二个作用就是去Nacos中去读取指定后缀为yaml的配置文件
1)bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
2)application.yml
spring:
profiles:
active: dev #表示开发环境
3、主启动
@SpringBootApplication
@EnableDiscoveryClient
public class CloudConfig3377Application {
public static void main(String[] args) {
SpringApplication.run(CloudConfig3377Application.class, args);
}
}
4、业务类
@RefreshScope实现配置自动更新,配置文件中的配置修改后不用重启项目即生效
@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
5、Nacos配置
Data ID配置格式为:${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,注意:**当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
**(不能删除)file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。- 通过 Spring Cloud 原生注解
@RefreshScope
实现配置自动更新:- 所以根据官方给出的规则我们最终需要在Nacos配置中心添加的配置文件的名字规则和名字为:
${spring.application.name}-${spring.profiles.active}.${file-extension}
nacos-config-client-dev.yaml
微服务名称-当前环境-文件格式
访问 http://localhost:3377/config/info
6、自动配置更新
修改Nacos配置,不需要重启项目即可自动刷新
测试访问
版权归原作者 柠萌蒜 所有, 如有侵权,请联系我们删除。