本文來自于《精通Spring Cloud Alibaba》課程的整理,講師為餘勝軍,
點選檢視視訊内容。
本文系志願者整理,供配合學習中心課程使用,不做商業用途。
Nacos整合SpringCloud
建立工程,需要選擇1.8

子產品名稱:然後Finish。
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>
如何實作服務的注冊?
會員服務(生産者)
服務接口
接口完成後,對會員進行注冊。
拿到配置檔案,對項目命名
配置檔案
application.yml檔案
spring:
cloud:
nacos:
discovery:
###服務注冊位址
server-addr: 127.0.0.1:8848
application:
name: mayikt-member
server:
port: 8081
再進行代碼測試,自動實作對服務進行注冊
詳情頁面:
訂單服務(消費者)
按照之前的步驟,建立消費者:
建立項目之後,第一步,根據服務名稱從 注冊中心 擷取叢集清單位址。
第二步,根據清單任意選擇一個 實作本地rpc調用rest
模拟運作:
配置檔案:
執行結果:
注意:RestTeanmlate它不是SpringCloud寫的,本身Spring支援Http協定調用
訂單調用會員服務
此時這個程式是不完善的,我們需要去修改:
服務接口:
@RestController
public class MemberService {
@Value("${server.port}")
private String serverPort;
/**
* 會員服務提供的接口
*
* @param userId
* @return
*/
@RequestMapping("/getUser")
public String getUser(Integer userId) {
return "每特教育,端口号:" + serverPort;
}
}
@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;
}
}
Rpc遠端調用設計到本地負載均衡算法。
1、從注冊中心擷取服務叢集的清單
2、從清單選擇一個
負載均衡算法有哪些
A、一緻性hash計算
B、輪訓、權重
C、随機
我們以輪訓為例,采用政策設計模式
通路次數%叢集size。
負載均衡算法
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() % serviceInstances.size();
ServiceInstance serviceInstance = serviceInstances.get(index);
return serviceInstance;
}
}
Nacos與其他注冊對比分析
通路之後在 服務清單中發現有兩個叢集。下線原理是在它的集合中移除
通過算法實時,實作中心擷取位址。
手寫RPC負載均衡五種算法。
權重需要對資料實作重新排序。
一緻性hash:
随機數從集合中随機尋找。
故障轉移:利用for循環,集合中取下一個值。
程式設計思維能力:舉一反三