第二次课:nacos服务注册与发现
分类: springboot 专栏: 新版springcloud分布式学习 标签: nacos学习
2024-04-23 11:40:20 803浏览
前言
我们学的是nacos的服务注册和发现,Eureka就暂时不学了,这个没nacos火了,感兴趣的小伙伴可以去自学了解下。
提一下消费者和提供者的概念。
上次课那种写法存在的问题分析:
//服务提供者的url是写死的
//如果服务提供者是集群模式 难道我们要自己写负载均衡的算法吗
String url= "http://localhost:81/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
return order;
认识nacos
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
nacos的基本使用
下载nacos服务器
https://github.com/alibaba/nacos/releases
修改bin目录里面的startup.cmd文件 集群模式改为单机模式
set MODE="cluster" 改为下面的
set MODE="standalone"
启动后直接访问localhost:8848/nacos
默认的账号密码都是nacos
springboot使用nacos
依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
</parent>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0-RC1</version>
</dependency>
配置文件
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
ip: 127.0.0.1
application:
name: user-service
开关注解
在微服务的启动类上加@EnableDiscoveryClient.表示是该微服务要注册到nacos的服务端
@EnableDiscoveryClient
public class UserApp {
启动项目后,在nacos的控制台看到的效果如下
配置负载均衡
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
修改远程调用的url
之前是写死的localhost:81现在变成访问应用名
//服务提供者的url是写死的
//如果服务提供者是集群模式 难道我们要自己写负载均衡的算法吗
// String url= "http://localhost:81/user/"+order.getUserId();
String url= "http://user-service/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
还是访问不到user-service怎么解决
在消费者端加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>4.0.0</version>
</dependency>
参考文章:https://blog.csdn.net/white0718/article/details/131788774
nacos两种健康检查模式
1.client上报模式
- 客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态;
- 默认心跳间隔5秒;
- nacos会在超过15秒未收到心跳后将实例设置为不健康状态;healthy改为false
- 超过30秒将实例删除;
2 服务端主动检测
- nacos主动探知客户端健康状态,默认间隔为20秒;
- 健康检查失败后实例会被标记为不健康,不会被立即删除。
- ephemeral为true对应的是服务健康检查模式中的 client 模式,为false对应的是 server 模式。(临时实例和非临时实例,非临时实例不会被剔除)
环境隔离
在不同的命名空间下是相互隔离的,无法相互调用
nacos服务分级存储模型
集群和实例是不一样的
测试的时候发现还是轮询的方式,所以要改变默认策略,咱们高版本已经不能用rabbon了
NacosRule负载均衡
演示消费者访问提供者集群的时候,优先选择本地集群,本地集群没有的情况下就只能跨集群访问(就近原则)
NacosRule负载均衡
演示消费者访问提供者集群的时候,优先选择本地集群,本地集群没有的情况下就只能跨集群访问(按集群权重分配)
配置类
@Configuration
public class RestConfig {
@Resource
NacosDiscoveryProperties nacosDiscoveryProperties;
@Bean
public ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty("loadbalancer.client.name");
return new NacosLoadBalancer(
loadBalancerClientFactory.getLazyProvider(name,
ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
@LoadBalancerClients(defaultConfiguration = {RestConfig.class})
public class OrderDemoApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderDemoApplication.class, args);
}
}
核心的就是@LoadBalancerClients(defaultConfiguration = {RestConfig.class})
参考文章:
https://blog.csdn.net/xaiobit_hl/article/details/134283093
实例的权重设置
实际用途:可以做项目的平滑升级,先将要升级的微服务其中的一个实例权重设置成0 ,代码部署更新后再调高权重即可,用户是无感知的,就不用凌晨升级代码了。
好博客就要一起分享哦!分享海报
此处可发布评论
评论(1)展开评论
您可能感兴趣的博客