71 nacos 實(shí)現(xiàn)微服務(wù)的注冊(cè)與發(fā)現(xiàn)

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)

image.png

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

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

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ī)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容