多台外网服务器部署SpringCloud服务

背景

    业务拆分后系统由多个子系统组成,多个子系统通过相互配合来支撑项目的运行。为了减轻单台服务器的压力,给单个服务预留更多的扩展空间,可以将新增的服务部署在新的服务器上。新服务需要知道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校验、接口签名验证等步骤。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容