背景
业务拆分后系统由多个子系统组成,多个子系统通过相互配合来支撑项目的运行。为了减轻单台服务器的压力,给单个服务预留更多的扩展空间,可以将新增的服务部署在新的服务器上。新服务需要知道Spring Cloud Config配置中心(以下简称配置中心)所在的服务器的地址,可以理解为必须在新服务中记录配置中心的位置,新服务需要的东西存放在配置中心,只有知道它的位置才拿到。下面我们来介绍跨服务器场景下的配置和部署:
缺点
1.时间长;
2.服务器通讯成本增加;
3.过程繁琐;
环境模拟
外网服务器清单:
名称 | 内网地址 | 外网地址 |
---|---|---|
A | A_INNER_IP | A_OUTER_IP |
B | B_INNER_IP | B_OUTER_IP |
A服务器部署的服务及其含义:
名称 | 含义 |
---|---|
Eureka(单机版) | 注册中心 |
Config | 配置中心 |
Gateway | 服务网关 |
User | 用户服务 |
Auth | 授权中心 |
B服务器部署的服务及其含义:
名称 | 含义 |
---|---|
Order | 订单服务 |
B服务器部署订单服务需要实现的效果:
- 订单服务(B服务器)可以注册到A服务器的注册中心;
- 订单服务(B服务器)可以调用用户服务(A服务器)的接口,例如查询用户信息;
实现步骤
如果配置中心和其他系统部署在同一台服务器上,那么配置会比较简单。
一、bootstrap.yml
假设订单服务在A服务器上部署,那么bootstrap.yml配置如下:
spring:
application:
name: order
cloud:
config:
fail-fast: true
name: ${spring.application.name}
profile: ${spring.profiles.active}
discovery:
enabled: true
service-id: config
其中,spring.cloud.config.discovery.enabled表示允许从注册中心发现配置中心的URL,spring.cloud.config.discovery.service-id表示需要发现的配置中心在注册中心上的注册名。这种适用于和配置中心处于同一个局域网的系统的配置
B服务器上部署订单服务,bootstrap.yml配置如下:
spring:
application:
name: order
cloud:
config:
# 配置中心内网地址
uri: http://A服务器内网地址:配置中心端口号/
# 设置加载环境,可以为dev(开发环境)、test(测试环境)
profile: prod
二、@FeginClient注解
订单服务要跨服务调用户服务的接口就需要在pom.xml中引入用户业务api模块,用户api模块利用Feign技术使订单服务调用用户服务变得十分简单,并且还包含了服务降级的功能。
假设订单服务在A服务器上部署,那么@FeignClient注解内容如下:
@FeignClient(name = ServiceNameConstants.USER_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
其中,name的作用类似于上文提到的service-id,表示被调用服务在注册中心上的注册名,注意,这里name的含义取决于当前微服务的部署方式,即微服务与配置中心部署在同一台服务器上。fallbackFactory表示在指定的类中编写接口降级处理的逻辑。完整代码如下:
/**
* 远程用户Service接口
*/
@FeignClient(name = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService {
/**
* 通过id查询用户
*
* @param id 用户表主键
* @return
*/
@GetMapping("api/user/get/{id}")
SysUser getUserById(@PathVariable("id") int id);
}
B服务器上部署订单服务,user-service-api模块下所有远程接口的@FeignClient注解的参数配置如下:
@FeignClient(name = ServiceNameConstants.ORDER_SERVICE, url = "http://A服务器内网地址:网关服务端口号/user/api/", fallbackFactory = 当前接口的实现类 .class)
fallbackFactory属性的含义与第一种情况相同,这里不再解释。
name属性的值是当前打包的微服务的名称,即使所有引入的业务api模块中包含非当前微服务的从属模块。例如,我们要在B服务器上部署order-service(订单服务),order-service引入了user-service-api模块,所以@FeignClient的name属性的值应是“order-service”而不是“user-service”。
url属性的值是网关服务的ip地址,其中,网关服务端口后的第一个参数的值参考调用目标服务(user-service)在网关服务中的路由配置,第二个参数的值是所有远程接口的标识,该标识的作用是将请求路径纳入过滤器的白名单,省去了token校验、接口签名验证等步骤。