上一篇:详解Nacos的产生与应用 | 带你读《Spring Cloud Alibaba(2019)》之三
下一篇:如何实现客户端负载均衡? | 带你读《Spring Cloud Alibaba(2019)》之五
本文来自于《精通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循环,集合中取下一个值。
编程思维能力:举一反三