概念
- 什么是注册中心(服务治理)
- 服务注册:服务提供者provider,启动的时候向注册中心上报自己的网络信息
- 服务发现:服务消费者consumer,启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息
- 核心:服务管理,是有个服务注册表,心跳机制动态维护,服务实例在启动时注册到服务注册表,并在关闭时注销。
- 为什么要用
- 微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题
- 主流的注册中心:zookeeper、Eureka、consul、etcd、Nacos
- 官网:https://nacos.io/zh-cn/
- Linux/Mac安装Nacos
解压安装包
进入bin目录
启动 sh startup.sh -m standalone
访问 localhost:8848/nacos
默认账号密码 nacos/nacos
集成Nacos
-
单个服务集成Nacos
- 添加依赖
<!--添加nacos客户端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- 配置Nacos地址
server: port: 9000 spring: application: name: class-video-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848
- 启动类增加注解
@EnableDiscoveryClient
-
服务之间的调用
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("save")
public VideoOrder save(int videoId){
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(videoId);
List<ServiceInstance> list = discoveryClient.getInstances("xdclass-video-service");
ServiceInstance serviceInstance = list.get(0);
Video video = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+
"/api/v1/video/find_by_id?videoId="+videoId,Video.class);
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setVideoId(video.getId());
return videoOrder;
}
负载均衡
- 什么是负载均衡(Load Balance)
分布式系统中一个非常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡,
原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高了数据的吞吐量
- 软硬件角度负载均衡的种类
- 通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但比较昂贵的
- 通过软件来进行解决,常见的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略
- 从端的角度负载均衡有两种
- 服务端负载均衡
- 客户端负载均衡
Ribbon
ribbon支持多种负载均衡策略
策略类 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(默认) |
RetryRule | 重试策略 | 当选择server不成功,短期内尝试选择一个可用的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
WeightedResponseTimeRule | 响应时间加权重策略 | 根据server的响应时间分配权重,以响应时间作为权重,响应时间越短的服务器被选中的概率越大,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server |
负载均衡策略调整
#业务名称
xxx-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
策略选择
1、如果每个机器配置一样,则建议不修改策略 (推荐默认轮询)
2、如果部分机器配置强,则可以改为:WeightedResponseTimeRule
Feign
什么是Feign
- SpringCloud提供的伪http客户端(本质还是用http),封装了Http调用流程,更适合面向接口化
- 让用Java接口注解的方式调用Http请求.
- 不用像Ribbon中通过封装HTTP请求报文的方式调用 Feign默认集成了Ribbon
- Nacos支持Feign,可以直接集成实现负载均衡的效果
官方文档:
https://spring.io/projects/spring-cloud-openfeign
使用方法
- 加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 配置注解
启动类增加**@EnableFeignClients** - 增加一个接口
@FeignClient(name="xxx-service")
加在service接口层,原来标记该service请求的服务提供者,即目标调用服务
4. 编写代码
@GetMapping(value = "/api/v1/video/find_by_id")
Video findById(@RequestParam("videoId") int videoId);
加在service接口层的方法上,标记清楚请求路径
Post方式提交
//订单消费者的service接口服务层这边请求
@PostMapping(value = "/api/v1/video/save")
Video saveVideo(@RequestBody Video video);
//视频生产者controller这边接收,两者都用POST
@PostMapping("save")
public Object save(@RequestBody Video video){
System.out.println(video.getTitle());
return video;
}
- 注意:
-
路径 核对
-
Http方法必须对应
-
使用服务提供方用@RequestBody,要使用@PostMapping
Ribbon和feign两个的区别和选择
选择Feign
默认集成了ribbon
写起来更加思路清晰和方便
采用注解方式进行配置,配置熔断等方式方便