FM项目如何本地联调测试环境

背景 目前公司还存在诸多前后端未分离项目(后面简称FM项目),开发同学在本地只能联调alpha环境,但是在项目转测转演之后,测试同学提的jira单都是hwbetagamma环境的,因此开发同学为了复现问题场景需要在alpha环境造单,或者麻烦测试同学造单,此过程非常低效。
分析 我们以本地启动webagent网关服务联调本地agentBuy-service服务为例分析流程。
【FM项目如何本地联调测试环境】FM项目如何本地联调测试环境
文章图片

agentBuy-service服务是一个controller层服务,调用其他远程服务获取数据并注入到页面文件(ftl)中,然后freemarker引擎将ftl编译成html并返回给浏览器
远程服务调用过程
现在我们深度分析下远程服务调用过程,先来看看Euraka是如何注册和发现服务的,Eureka官方结构图:
FM项目如何本地联调测试环境
文章图片

Spring-Cloud EurakaSpring Cloud集合中一个组件,它是对Euraka的集成,用于服务注册和发现。EurekaNetflix中的一个开源框架。它和 zookeeperConsul一样,都是用于服务注册管理的,同样,Spring-Cloud 还集成了ZookeeperConsul
Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka ServerEureka Client。为了便于理解,我们将Eureka client再分为Service ProviderService Consumer

  • Eureka Server 为服务注册中心,向外暴露自己的地址,负责管理、记录服务提供者的信息,同时将符合要求的服务提供者地址列表返回服务消费者
  • Service Provider 为服务提供者,在服务启动后,服务提供者向Eureka注册自己的IP、端口、提供服务等信息,并定时续约更新自己的状态等
  • Service Consumer为服务消费者,通过Eureka Server发现得到所需服务的提供者地址信息,然后向服务提供者发起远程调用
agentBuy-service是一个Maven Web项目
  • 集成Spring MVC搭建前后端未分离(MVC)项目;
  • 集成Eureka搭建消费者服务(Service Consumer),用于服务发现或者说定位服务;
  • 集成Ribbon实现客户端负载均衡,Spring Cloud Ribbon是一个基于HTTPTCP的客户端负载均衡工具,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用;
  • 集成Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。也就是说Feign封装好了与其他服务的请求、响应处理等;
以订单服务远程调用库存服务为例,描述EurekaRibbonFeign三者之间的关系:
FM项目如何本地联调测试环境
文章图片

参考:一文读懂SpringCloud与Eureka,Feign,Ribbon,Hystrix,Zuul核心组件间的关系
构建agentBuy-service消费者服务
pom文件中添加Eureka-client依赖
com.netflix.eureka eureka-client javax.servlet servlet-api

eureka-client.properties配置文件中增加相关配置信息,因为agentBuy-service消费者服务不需要提供服务给其他服务,所以不需要注册到注册中心(Eureka Server),设置不需要注册eureka.registration.enabled=falseeureka.registerWithEureka=false
// eureka-client.properties ###Eureka Client configuration for Sample Eureka Client# see the README in eureka-examples to see an overview of the example set up# note that for a purely client usage (e.g. only used to get information about other services, # there is no need for registration. This property applies to the singleton DiscoveryClient so # if you run a server that is both a service provider and also a service consumer, # then don't set this property to false. eureka.registration.enabled=false # 表示是否注册到Eureka Server,默认为true## configuration related to reaching the eureka servers eureka.preferSameZone=true eureka.shouldUseDns=false eureka.registerWithEureka=false # 表示是否将自己注册到Eureka Server,默认为trueeureka.serviceUrl.default=http://10.118.71.204:8761/eureka/ # 注册中心地址eureka.appinfo.replicate.interval=10eureka.vipAddress=agentbuy-service # 定义服务名变量 eureka.name=${eureka.vipAddress} # 服务名,SpringCloud中服务调用的依据 eureka.port=8001 # 服务端口 #eureka.ipAddr=192.168.29.170 #eureka.instanceId=${eureka.vipAddress}:${eureka.port} #eureka.hostname=${eureka.ipAddr} eureka.homePageUrlPath=/${eureka.vipAddress} #eureka.statusPageUrlPath=/${eureka.vipAddress}/status #eureka.healthCheckUrlPath=/${eureka.vipAddress}/health eureka.lease.renewalInterval=5 eureka.lease.duration=15 eureka.decoderName=JacksonJson

agentBuy-service远程调用inquiry-service
在发布询价页面会调用agentBuy-service服务中/getdeliveryaddresses/{companyId}/user/{userLoginId}接口获取收获地址,该接口远程调用了inquiry-service服务的方法获取收获地址
FM项目如何本地联调测试环境
文章图片

FM项目如何本地联调测试环境
文章图片

FM项目如何本地联调测试环境
文章图片

使用构造器创建Bean实例,constructor-arg子元素配置一个构造器参数,给FeignClientBuilder中的configAgentUrl属性(远程服务地址)赋值api.intra.url,其中api.intra.url变量在application.properties配置文件中定义
api.intra.url=http://alpha-api.intra.casstime.com

上述远程调用借助Feign完成,但是与平时远程调用的方式有所不同,上面采用FeignClientBuilder动态创建FeignClient实例去发起远程调用,而不是使用@Autowired注解让 spring 完成 bean 自动装配的工作生成实例发起远程调用
@Autowired注解方式:
@FeignClient(name = "inquiry-service") public interface InquiryClient extends InquiryService{}

然后向Spring容器中,注入FeignClient实例:
@Autowired private InquiryClient inquiryClient;

这是因为SPI包中提供的feign接口,是依赖于Spring Boot的,因此要求外部系统必须是Spring Boot应用,同时由于feign接口配置中没有指定服务调用的url地址,而采用指定服务名的方式,导致外部系统如果想调用feign接口,必须要和用户权限服务注册在同一个注册中心上。我们的agentBuy-service不是Spring Boot服务,采用FeignClientBuilder动态创建FeignClient实例可以摆脱对Spring Boot的依赖。
agentBuy-service服务本地联调其他环境
上面说到agentBuy-service是一个freemarker web服务,如果需要在本地联调hwbeta、gamma环境,只需要将远程调用服务地址指向hwbeta、gamma环境
(1)通过网关webagent走本地agentBuy-service
FM项目如何本地联调测试环境
文章图片

(2)更改agentBuy-service远程服务调用地址
因为agentBuy-service采用FeignClientBuilder动态创建FeignClient实例去发起远程调用,通过指定FeignClientBuilderconfigAgentUrl可以跨Eureka调用服务,不需要通过Eureka Server注册中心定位服务
FM项目如何本地联调测试环境
文章图片

FM项目如何本地联调测试环境
文章图片

    推荐阅读