写点什么

生产者消费者服务管理实践!API 网关实现服务聚合详解

发布于: 2021 年 05 月 21 日
生产者消费者服务管理实践!API网关实现服务聚合详解

API 网关的服务聚合

  • 通过同一个入口路由到不同的服务上

服务聚合实现

  • 由于服务器在集群部署的时候,同一个服务内容存在多个不同的服务 IP 地址,所以不能直接通过 IP 地址访问服务

  • API 服务访问的时候要先获取服务的 IP 地址,然后再访问服务

  • 进行服务聚合的项目要称为服务提供者(实现服务接口),服务提供者的 SpringApplication 要加 Main.main(args)提供远程调用接口给 API 网关

  • 此时可以获取到服务的 IP 地址

  • 如何获取服务 IP 地址?


上下文信息:上下文中存放的是当前调用过程中所需的环境信息,所有配置信息都将转换为 URL 的参数.RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态都会变化.比如:A 调 B,B 再调 C,则 B 机器上,在 B 调 C 之前,RpcContext 记录的是 A 调 B 的信息,在 B 调 C 之后,RpcContext 记录的是 B 调 C 的信息
服务消费方:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// 远程调用xxxService.xxx();// 本端是否为消费端,这里会返回trueboolean isConsumerSide = RpcContext.getContext().isConsumerSide();// 获取最后一次调用的提供方IP地址String serverIP = RpcContext.getContext().getRemoteHost();// 获取当前服务配置信息,所有配置信息都将转换为URL的参数String application = RpcContext.getContext().getUrl().getParameter("application");// 注意:每发起RPC调用,上下文状态会变化yyyService.yyy();--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------服务提供方:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------public class XxxServiceImpl implements XxxService { public void xxx() { // 本端是否为提供端,这里会返回true boolean isProviderSide = RpcContext.getContext().isProviderSide(); // 获取调用方IP地址 String clientIP = RpcContext.getContext().getRemoteHost(); // 获取当前服务配置信息,所有配置信息都将转换为URL的参数 String application = RpcContext.getContext().getUrl().getParameter("application"); // 注意:每发起RPC调用,上下文状态会变化 yyyService.yyy(); // 此时本端变成消费端,这里会返回false boolean isProviderSide = RpcContext.getContext().isProviderSide(); } }----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
复制代码


  • 在配置文件的 service 中配置上需要聚合的服务以及版本

  • 创建路由 controller


@Controllerpublic class RouterController{
@Value(value=${services.ports.user}) private String userPort;
@Value(value=${services.ports.content}) private String contentPort; @Reference private UserConsumerService userConsumerService;
@Reference private ContentConsumerService contentConsumerService;
@RequestMapping(value="user",method=RequestMethod.GET) public String user(String path){ userConsumerService.info(); return getRequest(userPort,path); }
@RequestMapping(value="content",method=RequestMethod.GET) public String content(String path){ contentConsumerService.info(); return getRequest(contentPort,path); } public String getRouter(String serverPort,String path){ // 判断是否为消费者 boolean isConsumerSide=RpcContext.getContext().isConsumerSide(); if(isConsumerSide){ // 获取最后一次调用的提供方的IP地址 String serverIP=RpcContext.getContext().getRemoteHost() return String.format("redirect:http://%s:%s%s",serverIP,serverPort,path); } return null; }}
复制代码


发布于: 2021 年 05 月 21 日阅读数: 10
用户头像

一位攻城狮的自我修养 2021.04.06 加入

分享技术干货,面试题和攻城狮故事。 你的关注支持是我持续进步的最大动力! https://github.com/ChovaVea

评论

发布
暂无评论
生产者消费者服务管理实践!API网关实现服务聚合详解