目录
一、相关文章
二、兼容说明
三、服务注册到Nacos
四、服务发现
五、服务分级存储模型
六、查看集群服务
七、LoadBalancer负载均衡
一、相关文章
-
基础工程:gradle7.6.1+springboot3.2.4创建微服务工程-CSDN博客
-
Nacos服务端安装:Nacos服务端安装-CSDN博客
-
Nacos架构&原理:https://www.yuque.com/nacos/ebook/un9fgs
-
LoadBalancer官方文档:https://spring.io/guides/gs/spring-cloud-loadbalancer
-
LoadBalancer自定义策略:https://blog.csdn.net/BASK2312/article/details/129025006
二、兼容说明
-
与SpringBoot3兼容的SpringCloud里的nacos-discovery依赖不含Ribbon,新增了LoadBalancer。
-
如果想使用Ribbon做负载均衡,参考https://blog.csdn.net/cherishSpring/article/details/149472343。
-
使用SpringBoot3,即使单独引用了Ribbon也是不生效的。
三、服务注册到Nacos
1、父工程cloud-demo3.0引入依赖
-
SpringCloud及SpringCloudAlibaba需根据SpringBoot参照[版本对照表]:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明
-
dependencyManagement引入依赖版本管理包,其管理的依赖引入不需要再指定版本
-
查看管理依赖版本[spring-cloud-dependencies]:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies/2023.0.1
-
查看管理依赖版本[spring-cloud-alibaba-dependencies]:https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies/2023.0.0.0-RC1
dependencyManagement { imports { mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:2023.0.0.0-RC1" } imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:2023.0.1" }
} dependencies { //nacos implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery' //springcloud2021开始,使用loadbalancer处理客户端负载均衡 implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
}
2、子工程application.yml配置
spring: application: name: order-service cloud: nacos: # nacos 服务端地址 server-addr: 192.168.10.104:10001 discovery: # 命名空间ID,需在注册中心创建再指定namespace: 44480e91-8290-43e4-9129-2d2d42ecd30a # 配置集群名称,也就是机房位置,如:HZ,杭州 cluster-name: HZ # nacos登录 username: nacos password: nacos# 是否是临时实例,临时实例心跳不正常会被剔除,非临时实例则不会被剔除ephemeral: false
3、临时实例与非临时实例区别:参考[[Nacos和Eureka对比]]中Nacos与Eureka的区别
4、 非临时实例必须调api才能删除,否则对应工程改为临时实例启动不了
### user-删除nacos注册中心user-service服务
DELETE http://127.0.0.1:10001/nacos/v2/ns/instance?serviceName=user-service&ip=192.168.10.104&port=8083&namespaceId=44480e91-8290-43e4-9129-2d2d42ecd30a&clusterName=HZ&ephemeral=false&groupName=DEFAULT_GROUP
Content-Type: application/x-www-form-urlencoded
5、在Nacos服务端创建namespace命名空间
-
namespace用来做环境隔离,如生产环境(prod)、开发环境(dev)
-
每个namespace都有唯一id
-
不同namespace下的服务不可见,prod的服务不能请求到dev去
6、启动多个user-service,参考idea中同服务启动多个-CSDN博客
四、服务发现
1、在OrderApplication类创建RestTemplate
@Bean
@LoadBalanced //添加使用负载均衡注解
RestTemplate restTemplate() { return new RestTemplate();
}
2、服务远程调用
//示例:在order服根据用户ID拉取user服用户信息
@Override
public Order getOrderById(Long orderId) { //获取订单信息 Order order = orderMapper.getOrderById(orderId); //根据订单用户ID获取用户信息,通过host:port拼接请求路径//String url = "http://localhost:8083/user/" + order.getUserId(); //eureka方式:通过user-service服务名拼接请求路径String url = "http://user-service/user/" + order.getUserId(); //执行远程调用User user = restTemplate.getForObject(url, User.class); order.setUser(user); return order;
}
五、服务分级存储模型
# 服务分级存储模型
一级是服务,例如user-service
二级是集群,例如杭州,上海
三级是实例,例如杭州机房的某台部署了user-service的服务器# 配置集群
spring.cloud.nacos.discovery.cluster-name: HZ
六、查看集群服务
七、LoadBalancer负载均衡
1、默认规则,详细分析可参考:https://blog.csdn.net/BASK2312/article/details/129025006
默认提供了三种不同的负载均衡器:
-
RandomLoadBalancer(随机负载均衡器)、
-
RoundRobinLoadBalancer(轮询负载均衡器)、
-
NacosLoadBalancer(同集群优先调用均衡器)
2、指定使用同集群优先调用策略
-
创建一个类CustomLoadBalancerConfiguration
-
OrderApplication加注解@LoadBalanced、@LoadBalancerClients
/**
* Spring Cloud LoadBalancer替代Ribbon实现 随机/轮询/同集群优先调用 方式负载均衡策略配置
*/
public class CustomLoadBalancerConfiguration { // Nacos配置属性 @Resource private NacosDiscoveryProperties nacosDiscoveryProperties; /** * 自定义负载均衡策略(随机/轮训/同集群优先调用) * * @return ReactorLoadBalancer */ @Bean ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory factory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); //return new NacosSameClusterWeightedRule(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); //同集群优先调用,只有Nacos有,Eureka没有 return new NacosLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties); //随机 //return new RandomLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); //轮询 //return new RoundRobinLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); }
}
@LoadBalancerClients(defaultConfiguration= CustomLoadBalancerConfiguration.class)
@SpringBootApplication
public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } @Bean @LoadBalanced //该注解表示使用负载均衡RestTemplate restTemplate() { return new RestTemplate(); }
}
3、根据权重负载均衡(权重值在0-1之间)
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。设为0表示后续不会调用,已发生的调用正常执行
设为0.1表示10个请求只有1个请求到8081同集群两个都为0.1,另一集群为1,设置了同集群优先调用规则,也只调用0.1集群里的服务