微服务模块间通信
微服务是由很多模块组成,但彼此之间又会进行互相调用,那么就会有方法来实现这个api接口进行远程调用,常见的调用方法有restTemplate,还有feign等,但随着使用,我们好像发现,feign的使用会更轻松,代码更可观,也更好的去理解。
RestTemplate
import org.springframework.web.client.RestTemplate;
@Autowired
private RestTemplate restTemplate;
我们可以看到这个类是在springframework包下的,所以可以直接引用。
下面我们来看一下restTemplate在使用时的方式:
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplate发起http请求,查询用户
// 2.1.url路径
String url = "http://userservice/user/" + order.getUserId();
// 2.2.发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
getForObject():
更偏向于直接获取响应内容的,因为他直接返回响应实体的body
(响应内容)
具体的关于RestTemplate的文章可以去阅读:t.csdn.cn/NH2Pl
我们在使用的时候还需要通过url来进行详细的拼接, 这里的usrservice是我们的模块名称,也是服务名称,他是注册在服务的注册中心当中,我们通过负载均衡策略去服务中心进行拉取最后决定选择哪一个服务进行调用。类似于userservice->localhost:8080,这是在本地和服务配置实现的。可以使用eureka和nacos服务注册中心。
编辑
这样的代码,肉眼课间的有些混乱和不美观,因此,我们打算使用feign来进行优化远程调用。
Nacos和Feign
Nacos不但是服务注册中心,也是配置中心。
我们在使用nacos,和feign的时候需要先导入依赖:
如果要使用nacos+feign可以直接导入这部分依赖就可以,不想区分就两个服务都导入,当然是你有引入spring-cloud等父依赖的情况下,依赖版本需要配置完整,我这里有依赖继承,可以根据自己的springboot版本来进行修改自己的依赖版本。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
org.springframework.cloud
spring-cloud-starter-openfeign
io.github.openfeign
feign-httpclient
cn.itcast.demo
feign-api
1.0
orderservice去调用userservice,所以都需要在注册中心进行注册,以及配置相应的日志级别和负载均衡策略,这里可以提供相关的参考来进行自己的配置。
orderservice的application.yml:这里的配置文件,application.name,和cloud.nacos和feign可以参考配置
erver:
port: 8088
spring:
datasource:
url:
username:
password:
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderservice
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
mybatis:
type-aliases-package:
configuration:
map-underscore-to-camel-case: true
logging:
level:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: # 指定饥饿加载的服务名称
- userservice
feign:
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
userservice的yml:
spring:
application:
name: userservice
profiles:
active: dev # 环境
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
Nacos服务注册:
编辑
Feign的调用架构:
编辑
我们把feign的接口提取出来,并且将相关的类和配置都配置好,作为一个模块,供其他模块引入调用。
结合代码实例理解:
编辑
通俗来说就是order-service和user-service就是两个出租屋子,他们有自己的锁,但是他们都把钥匙放在feign里了,如果有人需要就去拿着使用,比如说order像进user屋里面溜达溜达,就去feign拿user的钥匙,这样就可以使用这个屋子了。
集合代码:
编辑
引入pojo是因为我们使用了这个类所返回对象的方法,和config则是:
编辑
注册为bean方法,放进spring容器
编辑
编辑
下图的启动类会有显示。
UserClient就相当于这个钥匙@FeignClient就相当于声明它是一个钥匙,而对于想要使用这个钥匙的人,比如order-service:
编辑
就需要在这个启动类里面去配置:
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
这个作用就是springboot去自动扫描容器内的feignclient,就是你要使用出租屋,你得知道钥匙放在哪里吧(@EnableFeignClients),并且要使用哪一把钥匙(clients = UserClient.class)
@EnableFeignClients注解
编辑
packages就是你可以指定去配置扫描的包
@EnableFeignClients(basePackages = {"com.test.*"})
,clients也可以去扫名指定的类,前文已经提过。
Feign调用实例
这样服务和启动类配置好之后,springboot启动一扫描就知道,啊,原来我有这些屋子和钥匙可以使用,所以,order在使用user的时候就会变成:
编辑
是不是一下清爽了很多。
这里的userClient就是引用我们之前写的feign的包。
因此,我们在使用nacos+feign的时候明显会比之前用restTemplate舒服了很多,希望这篇文章有助于大家理解,如果对你有帮助的话,恳请点个赞鼓励一下哦