接入商重构相关技术介绍

        接入商服务处在娱票儿电影票业务调用链的底层。影院、影厅、影片、排期等基础数据的获取,下单、出票、查票、退票等线上交易都依赖接入商服务。旧版的接入商服务都打在一个jar中,由于和其它系统的高耦合性,稍有改动,依赖该项目的服务都需要重新打包上线。这种模式经常出问题,久经吐槽,我们决定对接入商服务彻底重构,下面简单介绍一下为了让重构后的新接入商服务能提供稳定可靠服务而引用的方案。


        上图是重构后新接入商服务和其它相关服务之间简单的调用关系,其中接入商网关(BIS-Gateway)、接入商服务(BIS-Service)、配置服务(Config-Server)等服务是采用Spring Boot构建,运行在容器云上的微服务。


一、微服务(Microservices)

        结合接入商服务的特点以及近来比较流行的技术方案,我们决定采用微服务的方式来重构。微服务架构对于接入商服务来说有很多优势:单个微服务易于开发维护、独立部署、独立扩展。


 二、框架(Frameworks)

        框架上我们采用了Spring Boot + Spring Cloud。传统Java框架配置繁多,开发起来显得格外笨重,而Spring Boot“约定优于配置(convention over configuration)” 的设计理念使得其能够在基本没有或少量的配置下快速构建和开发独立应用。Spring Boot内嵌了Tomcat、Jetty等Servlet容器,配合Docker这样的容器化技术,使得采用Spring Boot开发的微服务应用部署起来也非常灵活。Spring Cloud集成了分布式/版本化配置(Distributed/versioned configuration)、服务注册/服务发现(Service registration and discovery)、路由(Routing)、服务间调用(Service-to-service calls)、负载均衡(Load balancing)、 断路器(Circuit Breakers)、断路器(Circuit Breakers)、全局锁(Global locks)、领导人选举和集群状态检查(Leadership election and cluster state)、分布式消息(Distributed messaging)等组件。

        新接入商服务中采用了Spring Cloud提供的部分组件,如:配置服务(spring-cloud-starter-config)和断路器(spring-cloud-starter-hystrix),其它如服务注册发现、路由、负载均衡等则交由容器云(基于Marathon、Mesos、HAProxy等)实现。


三、持续集成(Continuous integration)

1、代码的坏味道(Bad smell)


        在《重构》一书中,作者列举了很多“代码的坏味道”,比如重复的代码、过长的函数、夸夸其谈的未来性(过度设计)等。而我们这次要说的是如何找到这些“坏味道”。现在我们很多项目已经接入了Jenkins CI(上图所示),每次commit都会对项目进行静态代码检查,它能帮助找出代码中一些潜在的bug、低效的实现、不规范的编码习惯等。理论上这些都应该由编码者自检,好的编码习惯有助于降低出错率,流行的IDE上都有类似FindBugs、PMD、CheckStyle等插件。


2、单元测试(Unit testing)

        静态代码检查能找出“代码的坏味道”,而逻辑里的“坏味道”则需要依靠单元测试来帮忙。

        单元测试应该是独立、隔离、可重复、高效的。为了验证一段代码的行为符合预期,最好的选择是替换其周围的代码,使你获得对环境的完整控制,有效地将被测代码与协作代码隔离,以便在其中测试你的代码。


隔离被测试的代码



测试替身的种类


        Mockito是一个简单实用的测试框架,它提供的@Spy、@Mock、@InjectMocks等注解非常实用。

 

3、集成测试(Integration testing)

        单元测试用于验证独立模块,集成测试能够有效验证整体的逻辑。

        我们希望集成测试的时候有稳定可靠的环境,而网络、依赖的接口服务、数据库、缓存等都被视为不稳定、不可靠的环境,为了保证我们的测试代码从仓库克隆到任意位置都能准确无误的执行所有测试,我们需要将这些不可靠的环境隔离,比如用mock来模拟这些环境,而不影响代码的逻辑。

       

 MockDB

        在测试的时采用嵌入式的内存数据库是一个不错的选择,我们采用了对MySql支持比较好的H2来做测试。


几种数据库的对比


MockRedis

        我们可以根据自己的需要写一个redis的mock实现,mock-jedis已经实现很多jedis的操作了,我们可以在其基础上进行加工。



 指定@Profile为“unit”时才会创建用于mock的redis操作的对象,其它情况下创建普通的redis操作对象。在单元测试中指定@ActiveProfiles("unit")即可。


 MockMVC & MockServer

        在测试中,所以来的接口服务以及网络情况可能会出现不稳定的状况,我们可以通过MockServer和MockMVC来模拟请求的发起和服务的返回。



参考书目:《Spring Boot Reference Guide》、《Spring Cloud Reference Guide》、《重构》、《有效的单元测试》等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值