且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四

更新时间:2022-04-07 22:51:46

上一篇:详解Nacos的产生与应用 | 带你读《Spring Cloud Alibaba(2019)》之三
下一篇:如何实现客户端负载均衡? | 带你读《Spring Cloud Alibaba(2019)》之五

本文来自于《精通Spring Cloud Alibaba》课程的整理,讲师为余胜军,点击查看视频内容
本文系志愿者整理,供配合学习中心课程使用,不做商业用途。

Nacos整合SpringCloud

创建工程,需要选择1.8
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四

模块名称:然后Finish。
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
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>

如何实现服务的注册?

会员服务(生产者)

服务接口

Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
接口完成后,对会员进行注册。
拿到配置文件,对项目命名

配置文件

application.yml文件

spring:
  cloud:
    nacos:
      discovery:
        ###服务注册地址
        server-addr: 127.0.0.1:8848
  application:
    name: mayikt-member
server:
  port: 8081

Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
再进行代码测试,自动实现对服务进行注册

Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四

Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
详情页面:
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四

订单服务(消费者)

按照之前的步骤,建立消费者:
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四

新建项目之后,第一步,根据服务名称从 注册中心 获取集群列表地址。
第二步,根据列表任意选择一个 实现本地rpc调用rest
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
模拟运行:
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
配置文件:
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
执行结果:
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四

注意:RestTeanmlate它不是SpringCloud写的,本身Spring支持Http协议调用
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四

订单调用会员服务

Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
执行结果:
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
此时这个程序是不完善的,我们需要去修改:
服务接口:

@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;
    }
}

执行结果:
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
Rpc远程调用设计到本地负载均衡算法。
1、从注册中心获取服务集群的列表
2、从列表选择一个

负载均衡算法有哪些
A、一致性hash计算
B、轮训、权重
C、随机

我们以轮训为例,采用策略设计模式
访问次数%集群size。

负载均衡算法

Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四

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与其他注册对比分析

访问之后在 服务列表中发现有两个集群。下线原理是在它的集合中移除
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
通过算法实时,实现中心获取地址。
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
手写RPC负载均衡五种算法。
权重需要对数据实现重新排序。
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
一致性hash:
Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四
随机数从集合中随机寻找。

故障转移:利用for循环,集合中取下一个值。
编程思维能力:举一反三