1 微服務架構服務治理的概念
2, 基於nacos實現服務註冊與發現
3, 使用Rest模板實現RPC調用
4,手寫Rpc 客戶端負載均衡算法。
SpringCloud 與SpringCloudlibaba的區別
SpringCloud rpc遠程調用整合
1,nacos 分佈式註冊中心,分佈式配置中心 SpringCloudEureka+config組合
SpringCloud rpc 遠程調用整合。
1,nacos 分佈式註冊中心,分佈式配置中心 SpringCloudEureka+cnfig組合
2,目的爲了推廣阿里雲產品,如果使用了SpringCloudAlibaba 建議最好使用整個體系的產品。
mq,rocketmq
總結:
SpringcloudAlibaba 實際上對我們的SpringCloud 做擴展組件開發 nacos ,setata分佈式解決框架, SchedulerX, Alibaba cloud OSS等,目的推廣阿里雲產品。
服務治理的基本概念:
服務治理的概念:
在rpc遠程調用過程中,服務與服務之間依賴關係非常大,服務url地址管理非常複雜,所以,這時候需要對我們的服務的url實現治理,通過服務治理可以實現服務註冊與發現,負載均衡,容錯等。
服務註冊中心的概念:
每次調用該服務如果地址直接寫死的話,一旦接口發生變化的情況下,這時候需要重新發布版本纔可以改接口調用地址,所以需要一個註冊中心統一管理我們的服務註冊與發現。
註冊中心: 我們的服務註冊到我們的註冊中心,key爲服務名稱,value爲該服務調用地址,該類型爲集合類型。Eureka ,consul,zookeeper,nacos
服務註冊: 我們生產者項目啓動的時候,會將當前服務自己的信息地址註冊到註冊中心。
服務發現: 消費者從我們的註冊中心上獲取生產者調用的地址(集合),在使用負載均衡的策略獲取集羣中某個地址實現本地rpc遠程調用。
微服務調用接口常用名詞:
生產者: 提供接口被其他服務調用;
消費者: 調用生產接口實現消費
nacos的基本介紹:
nacos可以實現分佈式服務註冊與發現/分佈式配置中心框架
官網介紹: <u>https://nacos.io/zh-cn/docs/what-is-nacos.html</u>
nacos的環境準備:
nacos可以在linux/windows/Mac
具體安裝教程: <u>https://nacos.io/zh-cn/docs/quick-start.html</u>
手動實現服務註冊與發現:
1.實現服務註冊 發送post請求:
2.實現服務發現
<u>http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName</u>
詳細步驟操作:<u>https://nacos.io/zh-cn/docs/quick-start.html</u>
nacos整合SpringCloud;
maven依賴:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<!-- springboot 整合web組件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
</dependencies>
會員服務(生產者)
服務接口:
@RestController
public class MemberService {
@Value("${server.port}")
private String serverPort;
/**
* 會員服務提供的接口
*
* @param userId
* @return
*/
@RequestMapping("/getUser")
public String getUser(Integer userId) {
return "每特教育,端口號:" + serverPort;
}
}
服務接口
配置文件
application.yml文件
spring:
cloud:
nacos:
discovery:
###服務註冊地址
server-addr: 127.0.0.1:8848
application:
name: mayikt-member
server:
port: 8081
訂單服務(消費者)
訂單調用會員服務
@RestController
public class OrderService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private LoadBalancer loadBalancer;
/**
* 訂單調用會員服務
*
* @return
*/
// @RequestMapping("/orderToMember")
// public String orderToMember() {
// // 從註冊中心上獲取該註冊服務列表
// List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("mayikt-member");
// ServiceInstance serviceInstance = serviceInstanceList.get(0);
// URI rpcMemberUrl = serviceInstance.getUri();
// // 使用本地rest形式實現rpc調用
// String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
// return "訂單調用會員獲取結果:" + result;
// }
@RequestMapping("/orderToMember")
public String orderToMember() {
// 從註冊中心上獲取該註冊服務列表
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("mayikt-member");
ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList);
URI rpcMemberUrl = serviceInstance.getUri();
// 使用本地rest形式實現rpc調用
String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
return "訂單調用會員獲取結果:" + result;
}
}
負載均衡算法
public interface LoadBalancer {
/**
* 根據多個不同的地址 返回單個調用rpc地址
*
* @param serviceInstances
* @return
*/
ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances);
}
@Component
public class RotationLoadBalancer implements LoadBalancer {
private AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances) {
int index = atomicInteger.incrementAndGet() % 2;
ServiceInstance serviceInstance = serviceInstances.get(index);
return serviceInstance;
}
}
Rpc 遠程調用設計到本地負載均衡算法
1.從註冊中心獲取服務集羣的列表
2.從列表選擇一個 負載均衡算法有那些:
A.一致性hash計算
B.輪訓 、權重
C.隨機