目錄
一、相關文章
二、兼容說明
三、服務注冊到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集群里的服務