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可以实现分布式服务注册与发现/分布式配置中心框架
官网介绍: https://nacos.io/zh-cn/docs/what-is-nacos.html
nacos的环境准备:
nacos可以在linux/windows/Mac
具体安装教程: https://nacos.io/zh-cn/docs/quick-start.html
手动实现服务注册与发现:
1.实现服务注册 发送post请求:
'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
2.实现服务发现
http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName
详细步骤操作:https://nacos.io/zh-cn/docs/quick-start.html
nacos整合SpringCloud;
maven依赖:
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
0.2.2.RELEASE
会员服务(生产者)
服务接口:
@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 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 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 serviceInstances);
}
@Component
public class RotationLoadBalancer implements LoadBalancer {
private AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public ServiceInstance getSingleAddres(List serviceInstances) {
int index = atomicInteger.incrementAndGet() % 2;
ServiceInstance serviceInstance = serviceInstances.get(index);
return serviceInstance;
}
}
Rpc 远程调用设计到本地负载均衡算法
1.从注册中心获取服务集群的列表
2.从列表选择一个 负载均衡算法有那些:
A.一致性hash计算
B.轮训 、权重
C.随机