71 nacos 實現微服務的註冊與發現

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請求:

'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

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.隨機

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章