目录
为什么需要这么个东西,他解决了什么痛点?
方法一 RestTemplate:
引入概念:注册中心:
方法二 nacos服务:
其他
为什么需要这么个东西,他解决了什么痛点?
我们在初始学习微服务时候,会拆分单体项目。会遇到这么一个问题:“远程调用问题:我这个微服务,要用到另一个微服务的一个service,在单体项目中,直接注入一个service用就可以。但微服务代码数据库都是分开的,在微服务中有没有什么好方法?”
方法一RestTemplate:
RestTemplate,由spring提供,可以方便的发送Http请求。
用法:创一个RestTemplate并注入容器,用的时候注入,并调用其exchange方法。(还有很多其他方法,可以查阅了解,不做详细介绍)
缺点:服务的治理问题:url是写死的。如果A想调用B的某个接口,但B有多个服务部署了,不是道调用哪一个。而且如果一个B服务挂掉了,或者新的B服务启动了,A都不知道,没法处理。
引入概念:注册中心:
既然有这个缺点,我们能不能找个中间人?就像找家政一样,我们就让A不要去直接找B,而是找“家政中心”,有啥事你去找“家政中心”,他里面管理了B的各个服务的信息。(也就是注册中心)
当A找上门来,注册中心就去看看那个阿姨有空。安排给你提供服务。(也就是负载均衡)
当B某个服务新增或者挂掉了,能及时反映给“家政中心”。(也就是心跳续约)
方法二 nacos服务:
注册nacos服务:
1: 数据库中创建nacos表,方便存储。
2:docker部署nacos容器。
服务治理:
- 服务注册:引入nacos discovery依赖,配置Nacos地址。
- 服务发现:引入nacos discovery依赖,配置Nacos地址。然后调用,传入参数(手写负 载均衡)。
问题:服务发现手写比较麻烦。
OpenFeign:
- 引入依赖,OpenFeign和SpringCloudLoadBalancer。
- 通过@EnableFeiClients,开启OpenFeign功能。
- 编写FeignClient。
@FeignClient("item-service"):声明服务名称@GetMapping:声明请求方式@GetMapping("/items"):声明请求路径@RequestParam("ids") Collection<Long> ids:声明请求参数List<ItemDTO>:返回值类型
@FeignClient("item-service") public interface ItemClient { @GetMapping("/items") List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids); }- 使用FeignClient。注入对应的client类,然后调用对应的方法。
其他
日志配置:省略。
开启连接池:
- 引入连接池依赖
feign: okhttp: enabled: true # 开启OKHttp功能
client类实现在A中,不合理,代码重复率高,两种抽取思路:
思路1:抽取到微服务之外的公共module
思路2:每个微服务自己抽取一个module
实现:1.引入对应的依赖坐标。2. @EnableFeignClient扫描到对应的包。
com.hmall.api.client