1 微服務(wù)架構(gòu)服務(wù)治理的概念
2, 基于nacos實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)
3, 使用Rest模板實(shí)現(xiàn)RPC調(diào)用
4,手寫(xiě)Rpc 客戶端負(fù)載均衡算法。
SpringCloud 與SpringCloudlibaba的區(qū)別
SpringCloud rpc遠(yuǎn)程調(diào)用整合
1,nacos 分布式注冊(cè)中心,分布式配置中心 SpringCloudEureka+config組合
SpringCloud rpc 遠(yuǎn)程調(diào)用整合。
1,nacos 分布式注冊(cè)中心,分布式配置中心 SpringCloudEureka+cnfig組合
2,目的為了推廣阿里云產(chǎn)品,如果使用了SpringCloudAlibaba 建議最好使用整個(gè)體系的產(chǎn)品。
mq,rocketmq
總結(jié):
SpringcloudAlibaba 實(shí)際上對(duì)我們的SpringCloud 做擴(kuò)展組件開(kāi)發(fā) nacos ,setata分布式解決框架, SchedulerX, Alibaba cloud OSS等,目的推廣阿里云產(chǎn)品。
服務(wù)治理的基本概念:
服務(wù)治理的概念:
在rpc遠(yuǎn)程調(diào)用過(guò)程中,服務(wù)與服務(wù)之間依賴關(guān)系非常大,服務(wù)url地址管理非常復(fù)雜,所以,這時(shí)候需要對(duì)我們的服務(wù)的url實(shí)現(xiàn)治理,通過(guò)服務(wù)治理可以實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn),負(fù)載均衡,容錯(cuò)等。
服務(wù)注冊(cè)中心的概念:
每次調(diào)用該服務(wù)如果地址直接寫(xiě)死的話,一旦接口發(fā)生變化的情況下,這時(shí)候需要重新發(fā)布版本才可以改接口調(diào)用地址,所以需要一個(gè)注冊(cè)中心統(tǒng)一管理我們的服務(wù)注冊(cè)與發(fā)現(xiàn)。
注冊(cè)中心: 我們的服務(wù)注冊(cè)到我們的注冊(cè)中心,key為服務(wù)名稱,value為該服務(wù)調(diào)用地址,該類(lèi)型為集合類(lèi)型。Eureka ,consul,zookeeper,nacos
服務(wù)注冊(cè): 我們生產(chǎn)者項(xiàng)目啟動(dòng)的時(shí)候,會(huì)將當(dāng)前服務(wù)自己的信息地址注冊(cè)到注冊(cè)中心。
服務(wù)發(fā)現(xiàn): 消費(fèi)者從我們的注冊(cè)中心上獲取生產(chǎn)者調(diào)用的地址(集合),在使用負(fù)載均衡的策略獲取集群中某個(gè)地址實(shí)現(xiàn)本地rpc遠(yuǎn)程調(diào)用。
微服務(wù)調(diào)用接口常用名詞:
生產(chǎn)者: 提供接口被其他服務(wù)調(diào)用;
消費(fèi)者: 調(diào)用生產(chǎn)接口實(shí)現(xiàn)消費(fèi)

nacos的基本介紹:
nacos可以實(shí)現(xiàn)分布式服務(wù)注冊(cè)與發(fā)現(xiàn)/分布式配置中心框架
官網(wǎng)介紹: <u>https://nacos.io/zh-cn/docs/what-is-nacos.html</u>
nacos的環(huán)境準(zhǔn)備:
nacos可以在linux/windows/Mac
具體安裝教程: <u>https://nacos.io/zh-cn/docs/quick-start.html</u>
手動(dòng)實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn):
1.實(shí)現(xiàn)服務(wù)注冊(cè) 發(fā)送post請(qǐng)求:
2.實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)
<u>http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName</u>
詳細(xì)步驟操作:<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>
會(huì)員服務(wù)(生產(chǎn)者)
服務(wù)接口:
@RestController
public class MemberService {
@Value("${server.port}")
private String serverPort;
/**
* 會(huì)員服務(wù)提供的接口
*
* @param userId
* @return
*/
@RequestMapping("/getUser")
public String getUser(Integer userId) {
return "每特教育,端口號(hào):" + serverPort;
}
}
服務(wù)接口
配置文件
application.yml文件
spring:
cloud:
nacos:
discovery:
###服務(wù)注冊(cè)地址
server-addr: 127.0.0.1:8848
application:
name: mayikt-member
server:
port: 8081
訂單服務(wù)(消費(fèi)者)
訂單調(diào)用會(huì)員服務(wù)
@RestController
public class OrderService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private LoadBalancer loadBalancer;
/**
* 訂單調(diào)用會(huì)員服務(wù)
*
* @return
*/
// @RequestMapping("/orderToMember")
// public String orderToMember() {
// // 從注冊(cè)中心上獲取該注冊(cè)服務(wù)列表
// List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("mayikt-member");
// ServiceInstance serviceInstance = serviceInstanceList.get(0);
// URI rpcMemberUrl = serviceInstance.getUri();
// // 使用本地rest形式實(shí)現(xiàn)rpc調(diào)用
// String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
// return "訂單調(diào)用會(huì)員獲取結(jié)果:" + result;
// }
@RequestMapping("/orderToMember")
public String orderToMember() {
// 從注冊(cè)中心上獲取該注冊(cè)服務(wù)列表
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("mayikt-member");
ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList);
URI rpcMemberUrl = serviceInstance.getUri();
// 使用本地rest形式實(shí)現(xiàn)rpc調(diào)用
String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
return "訂單調(diào)用會(huì)員獲取結(jié)果:" + result;
}
}
負(fù)載均衡算法
public interface LoadBalancer {
/**
* 根據(jù)多個(gè)不同的地址 返回單個(gè)調(diào)用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 遠(yuǎn)程調(diào)用設(shè)計(jì)到本地負(fù)載均衡算法
1.從注冊(cè)中心獲取服務(wù)集群的列表
2.從列表選擇一個(gè) 負(fù)載均衡算法有那些:
A.一致性hash計(jì)算
B.輪訓(xùn) 、權(quán)重
C.隨機(jī)