Nacos如何整合SpringCloud ?| 带你读《Spring Cloud Alibaba(2019)》之四-阿里云开发者社区

开发者社区> 开发者学习资源库> 正文

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

简介: 本节介绍Maven依赖信息,会员服务(生产者),订单服务(消费者)

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

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

Nacos整合SpringCloud

创建工程,需要选择1.8
image.png
image.png

模块名称:然后Finish。
image.png
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>

如何实现服务的注册?

会员服务(生产者)

服务接口

5.png
接口完成后,对会员进行注册。
拿到配置文件,对项目命名

配置文件

application.yml文件

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

6.png
再进行代码测试,自动实现对服务进行注册

image.png

image.png
详情页面:
image.png

订单服务(消费者)

按照之前的步骤,建立消费者:
image.png

新建项目之后,第一步,根据服务名称从 注册中心 获取集群列表地址。
第二步,根据列表任意选择一个 实现本地rpc调用rest
image.png
模拟运行:
image.png
配置文件:
image.png
执行结果:
image.png

注意:RestTeanmlate它不是SpringCloud写的,本身Spring支持Http协议调用
image.png

订单调用会员服务

image.png
执行结果:
image.png
此时这个程序是不完善的,我们需要去修改:
服务接口:

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

执行结果:
image.png
Rpc远程调用设计到本地负载均衡算法。
1、从注册中心获取服务集群的列表
2、从列表选择一个

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

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

负载均衡算法

12.png

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

访问之后在 服务列表中发现有两个集群。下线原理是在它的集合中移除
image.png
通过算法实时,实现中心获取地址。
14.png
15.png
手写RPC负载均衡五种算法。
权重需要对数据实现重新排序。
16.png
一致性hash:
image.png
随机数从集合中随机寻找。

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

开发者免费资源中心,技术电子书、会议PPT、论文资料持续供应中

官方博客
官网链接