Nacos+LoadBalancer实现服务注册与发现

目录

一、相关文章

二、兼容说明

三、服务注册到Nacos

四、服务发现

五、服务分级存储模型

六、查看集群服务

七、LoadBalancer负载均衡


一、相关文章
二、兼容说明
三、服务注册到Nacos

1、父工程cloud-demo3.0引入依赖

Groovy 复制代码
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配置

Groovy 复制代码
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才能删除,否则对应工程改为临时实例启动不了

bash 复制代码
### 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

java 复制代码
@Bean  
@LoadBalanced  //添加使用负载均衡注解
RestTemplate restTemplate() {  
	return new RestTemplate();  
}

2、服务远程调用

java 复制代码
//示例:在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;  
}
五、服务分级存储模型
bash 复制代码
# 服务分级存储模型
一级是服务,例如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

java 复制代码
/**  
* 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);  
	}  
}
java 复制代码
@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之间)

java 复制代码
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

设为0表示后续不会调用,已发生的调用正常执行
设为0.1表示10个请求只有1个请求到8081

同集群两个都为0.1,另一集群为1,设置了同集群优先调用规则,也只调用0.1集群里的服务
相关推荐
2301_763472464 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
TechWJ4 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
qq_12498707534 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_5 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.5 小时前
Day06——权限认证-项目集成
java
瑶山5 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy5 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
lly2024065 小时前
C++ 文件和流
开发语言
2301_818732065 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
m0_706653235 小时前
分布式系统安全通信
开发语言·c++·算法