转载

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

Apache ServiceComb ServiceCenter 1.3.0版本已于2019年11月07日发布,在这次版本中带来了异构、多服务中心同步工具 Syncer,在这里将从我们的已有的实践经验出发,带来对Syncer的介绍。

项目地址: https://github.com/apache/servicecomb-service-center/tree/master/syncer

1.3.0版本下载: http://servicecomb.apache.org/release/service-center-downloads/

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

为什么使用服务中心同步工具

从传统架构到微服务,为了解决微服务之间动态变更带来的问题,各微服务框架百花齐放,从而衍生出Service-center、eureka、consul等一系列服务中心;在云环境大行其道的今天,公/私有云并存、混合云部署在企业实践中似乎已成为趋势。在这过程中不得不面临一些问题:

  • 异构服务中心间的实例如何发现?

  • 跨区域间的实例信息怎么同步?

  • 统一企业内部微服务架构过程中,如何平滑迁移?

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

中心化解决方案带来的思考

在最初的项目中,我们应用了ServiceCenter的中心化解决方案ServiceCenter Aggregate,详细介绍请参考: https://github.com/apache/servicecomb-service-center/blob/master/docs/multidcs.md

在使用这样的中心化解决方案后,异构服务中心的实例被同步到Aggregate 中,服务只需指定服务发现地址到 Aggregate,即可实现对异构、跨区域实例的发现,同时也支持了微服务架构之间的平滑迁移。

经过一段时间的使用,集中式、中心化方案的不足逐渐显现,于是便有了如下的思考:

  • 对业务服务不透明,需要修改服务发现地址。

  • 设计理念倾向于对自身服务中心的迁入,对异构服务中心并存支持不够友好。

  • 中心化的架构,单点故障会造成同步的暂停,影响依赖服务的正常运行。

  • 同步、数据结构转换的工作集中在单个服务中,容易造成性能瓶颈。

  • 增加新的服务中心支持时,需要重新编译、启动同步服务。

  • 维护成本增加,运维人员配置规则时需要理解所有服务中心的信息。

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

Apache ServiceComb Syncer

针对以上的问题与思考,我们带来了去中心化的解决方案 ApcheServiceComb Syncer。Syncer是一个多服务中心的同步工具,专为大型微服务架构设计,用于在网络互通的情况下,不同技术栈服务中心、跨区域的实例同步,未来将对跨网络、跨云等场景提供支持。

Syncer的架构设计

▲▲▲

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

Syncer以服务中心的伴生系统的形式而存在,主要负责从当前服务中心发现实例,并向网络其他成员进行广播;接收其他成员的广播,并拉取实例信息向当前服务中心进行注册。Syncer有如下特点:

  • 业务架构零侵入,Syncer 以透明的形式为服务中心同步实例信息,不参与原业务流程,服务无需感知其存在。

  • 不绑定服务中心,兼容生态,支持不同技术栈服务中心的接入。

  • 基于Serf(gossip     协议的实现)构建无中心的对等网络,成员的自由加入与退出,对 Syncer 网络、服务中心均无影响。

  • 以统一的数据结构在网络中进行传递,数据结构的转换被分散到各个 Syncer 中,其只需要处理当前服务中心数据结构与 SyncData 之间的转换,即可做到数据的最大兼容。

  • 以 golang 插件的形式对服务中心提供支持,用户可自由的扩展需要接入的服务中心。新的服务中心加入,只需在其伴生的 Syncer 进行向 SyncerData 的转换,数据即可在     Syncer 网络中进行同步,无需其他成员配合。

  • 服务的配置、部署、升级、维护等仍在单服务中心内完成,没有额外的业务维护成本增加。

下面我们通过具体的业务流程来进一步了解 Syncer。

组网流程

▲▲▲

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

上图左侧绿色 SyncerN 是一个待加入网络的成员。

  1. SyncerN 在启动之后,通过向 JoinAddr 所指向的 SyncerB 发起 Join 请求。

  2. 通过 serf 的自动发现与广播机制,一段时间后,SyncerN 的信息会传播到网络中所有成员处,组网成功。

  3. 若 Syncer 是以 cluster 模式启动的,Syncer 通过标记的 cluster tag 将相同的 cluster 归为一组,从而实现内部的高可用集群。

数据同步流程

▲▲▲

Syncer 的同步流程同步流程并不复杂,下图具体描述了两个 Syncer 将不同服务中心的实例进行同步的过程。

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

适用场景

▲▲▲

  • 网络互通的异构、多服务中心实例信息同步,支持异构服务中的并存、多服务中心实例共享。

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

上图左,两套服务中心(ServiceCenter 和 Eureka)各自为政,各自辖区的服务无法跨越架构边界,无法发现对方服务实例,从而无法进行通讯。上图右,两套服务中心的实例将通过Syncer 同步,在两个服务中心里,最后都将呈现出所有的实例,服务之间无障碍发现,从而实现实例的共享通讯。

  • 支持异构服务中心实例任意方向的平滑改造迁移。

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

Syncer 统一了同步数据结构 SyncData,并以插件的形式提供对各服务中心的支持,各服务中心只需实现实例数据与 SyncData 的转换,即可完成异构服务中心数据的转换。从而在架构迁移的过程中,可以使用 Syncer 实现系统的逐步迁移,平稳过渡。

  • 多微服务技术栈并存时,微服务依据自身诉求自由选型。

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

在企业的发展道路中,经常会出现由于某个核心服务使用了某个技术栈,导致与其对接的服务只能迁就,从而放弃更适合的选型。Syncer 支持异构同步的特性,可以有效冲破这个限制,使业务选型遵从业务本身诉求。

下面我们将通过一个异构服务中心同步的示例,从实践出发进一步了解Syncer。

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

ServiceComb-ServiceCenter 与 SpringCloudEureka 实例互通实践

示例代码: https://github.com/apache/servicecomb-service-center/blob/master/syncer/samples/multi-servicecenters

本案例模拟了异构服务中心之间的通讯场景,包括以下四个部分:

  • EurekaServer:Eureka服务中心

  • AccountServer :注册到Eureka的账号服务

  • Servicecomb-ServiceCenter :Servicecomb-ServiceCenter服务中心

  • HelloServer :注册到Servicecomb-ServiceCenter,需要使用AccountServer的服务

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

运行环境

  1. 2台linux机器:     (假设为:10.0.0.10 和 10.0.0.11)

  2. JDK 1.8:

    http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  3. Maven 3.x:

    https://maven.apache.org/install.html

  4. Go 1.11.4:

    https://golang.google.cn/dl/

  5. ServiceComb Service-Center 1.3.0:

    https://apache.org/dyn/closer.cgi/servicecomb/servicecomb-service-center/1.3.0/

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

运行前的准备(两台机器都需运行)

  1. 下载并解压 ServiceCenter 1.3.0 版本包

$ project_dir=`pwd`

$ wget -O http://us.mirrors.quenda.co/apache/servicecomb/servicecomb-service-center/1.3.0/apache-servicecomb-service-center-1.3.0-linux-amd64.tar.gz

$ tar -zxvf apache-servicecomb-service-center-1.3.0-linux-amd64.tar.gz

  1. 下载样例源码: https://github.com/apache/servicecomb-service-center/tree/master/syncer/samples/multi-servicecenters

git clone https://github.com/apache/servicecomb-service-center.git

cd ${project_dir}/servicecomb-service-center/syncer

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

步骤1:启动Eureka环境和服务

机器:10.0.0.10

1. 编译项目

# 编译EurekaServer 和AccountServer

$ cd samples/multi-servicecenters/eureka

$ mvn clean install

2. 启动EurekaServer:

  • 修改启动配置

    文件位置:${project_dir}/servicecomb-service-center/syncer/samples/multi-servicecenters/eureka/eureka-server/src/main/resources/application.yaml

spring:

application:

name:eureka-server

server:

port : 8761

# servlet:

# context-path: /eureka

eureka:

instance:

hostname :10.0.0.10

client:

registerWithEureka : false

fetchRegistry : false

serviceUrl:

defaultZone : http://${eureka.instance.hostname}:${server.port}/eureka/

management:

endpoints:

web:

exposure:

include: "*"

  • 启动服务

# 启动EurekaServer

$ cd ${project_dir}/servicecomb-service-center/syncer/samples/multi-servicecenters/eureka/eureka-server/

$ nohup mvn spring-boot:run & >>eureka-server.log 2>&1 &

浏览器打开http://10.0.0.10:8761,若出现如下页面,则启动成功

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

3. 启动AccountServer

  • 修改启动配置
    文件位置:${project_dir}/servicecomb-service-center/syncer/samples/multi-servicecenters/eureka/account-server/src/main/resources/application.yaml

spring:

application:

name:account-server

server:

port: 8090

eureka:

instance:

hostname:10.0.0.10

client:

service-url:

defaultZone: http://${eureka.instance.hostname}:8761/eureka/

management:

endpoints:

web:

exposure:

include: "*"

  • 启动服务

#启动AccountServer

$ cd${project_dir}/servicecomb-service-center/syncer/samples/multi-servicecenters/eureka/account-server

$ mvn spring-boot:run#启动 AccountServer

$ cd ${project_dir}/servicecomb-service-center/syncer/samples/multi-servicecenters/eureka/account-server

$ mvn spring-boot:run

# 出现如下字样则为成功


2019-09-19 17:20:35.534 INFO 20890 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8090 (http) with context path ''

2019-09-19 17:20:35.548 INFO 20890 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8090

2019-09-19 17:20:35.551 INFO 20890 --- [ main] o.a.s.s.account.AccountApplication : Started AccountApplication in 3.92 seconds (JVM running for 6.754)

2019-09-19 17:20:35.617 INFO 20890 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_ACCOUNT-SERVER/10.0.0.10:account-server:8090 - registration status: 2042019-09-19 17:20:35.534 INFO 20890 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8090 (http) with context path ''

2019-09-19 17:20:35.548 INFO 20890 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8090

2019-09-19 17:20:35.551 INFO 20890 --- [ main] o.a.s.s.account.AccountApplication : Started AccountApplication in 3.92 seconds (JVM running for 6.754)

2019-09-19 17:20:35.617 INFO 20890 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_ACCOUNT-SERVER/10.0.0.10:account-server:8090 - registration status: 204

此时打开http://10.0.0.10:8761,可以看到AccountServer已经注册成功

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

4. 启动Syncer

$ cd ${project_dir}/apache-servicecomb-service-center-1.3.0-linux-amd64/

$ ./syncer daemon --sc-addrhttp://10.0.0.10:8761/eureka --bind-addr 10.0.0.10:30190 --rpc-addr10.0.0.10:30191 --sc-plugin=eureka

# 出现如下字样则为成功

2019-09-19T17:28:28.809+0800 INFO etcd/agent.go:55 start etcdsuccess

2019-09-19T17:28:28.809+0800 INFO grpc/server.go:94 start grpc success

2019-09-19T17:28:28.809+0800 DEBUG server/handler.go:39 is leader: true

2019-09-19T17:28:28.809+0800 DEBUG server/handler.go:43 Handle Tick

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

步骤2:启动Servicecenter环境和服务

机器:10.0.0.11

1. 编译项目

# 编译HelloServer

$ cdsamples/multi-servicecenters/servicecenter/hello-server/

$ GO111MODULE=on go build

2. 启动Servicecenter

  • 修改启动配置:
    文件位置:${project_dir}/apache-servicecomb-service-center-1.3.0-linux-amd64/conf/app.conf

frontend_host_ip = 10.0.0.11

frontend_host_port = 30103

###################################################################

# sever options

###################################################################

# if you want to listen at ipv6 address, then setthe httpaddr value like:

# httpaddr = 2400:A480:AAAA:200::159 (global scope)

# httpaddr = fe80::f816:3eff:fe17:c38b%eth0(link-local scope)

httpaddr = 10.0.0.11

httpport = 30100

# ...以下省略...

  • 启动 ServiceCenter 和 Frontend

$ cd ${project_dir}/apache-servicecomb-service-center-1.3.0-linux-amd64/

# 启动 ServiceCenter

$ ./start-service-center.sh

# 启动 前端页面 Frontend

$ ./start-frontend.sh

浏览器打开http://10.0.0.11:30103,若出现如下页面,则启动成功

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

3. 启动HelloServer

  • 修改启动配置:
    文件位置:${project_dir}/servicecomb-service-center/syncer/samples/multi-servicecenters/servicecenter/hello-server/conf/microservice.yaml

service: # 微服务配置

appId:eureka # eureka 中同步的实例appID均为:eureka

name:hello-server

version:0.0.1

instance: # 实例信息

protocol:rest

listenAddress: 10.0.0.11:8091 #实例监听地址

provider: # 服务端信息

appId:eureka

name:account-server

version: 0.0.1

registry:

address: http://10.0.0.11:30100

  • 启动服务

# 启动 HelloServer

$ cd${project_dir}/servicecomb-service-center/syncer/samples/multi-servicecenters/servicecenter/hello-server

$ ./hello-server

# 出现如下字样则为成功


2019-09-19T18:37:50.645+0800 DEBUG servicecenter/servicecenter.go:163 send heartbeat success

2019-09-19T18:37:50.645+0800 WARN servicecenter/servicecenter.go:85 discovery provider failed, appID =eureka, name = account-server, version = 0.0.1

2019-09-19T18:37:50.645+0800 INFO servicecenter/servicecenter.go:87 waiting for retry

此时打开http://10.0.0.11:30103,可以看到HelloServer已经注册成功

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

但由于无法发现属于Eureka服务中心的AccountServer实例,HelloServer处于重试状态
注:重试次数为 3 次,每次间隔 30 秒,所以我们需要在 90 秒内完成后面的操作

4.启动Syncer

$ cd ${project_dir}/apache-servicecomb-service-center-1.3.0-linux-amd64/

$ ./syncer daemon --sc-addr http://10.0.0.11:30100--bind-addr 10.0.0.11:30190 --rpc-addr 10.0.0.11:30191--sc-plugin=servicecenter --join-addr 10.0.0.10:30190

# 出现以下内容则为Syncer成功启动,并同步了对方的实例

2019-09-19T18:44:35.536+0800 DEBUG server/handler.go:62 is leader: true

2019-09-19T18:44:35.536+0800 DEBUG server/handler.go:79 Receive serf user event

2019-09-19T18:44:35.536+0800 DEBUG serf/agent.go:130 member = xxxxxa,groupName = 0204d59328090c2f4449a088d4e0f1d8

2019-09-19T18:44:35.536+0800 DEBUG serf/agent.go:130 member = xxxxxb,groupName = 34f53a9520a11c01f02f58f733e856b3

2019-09-19T18:44:35.536+0800 DEBUG server/handler.go:97 Going to pull data from xxxxxb10.0.0.10:30191

2019-09-19T18:44:35.536+0800 INFO grpc/client.go:76 Create new grpc connection to 10.0.0.10:30191

2019-09-19T18:44:35.538+0800 DEBUG servicecenter/servicecenter.go:87create service success orgServiceID= account-server, curServiceID =80784229255ec96d90353e3c041bdf3586fdbbae

2019-09-19T18:44:35.538+0800 DEBUG servicecenter/servicecenter.go:90trying to do registration of instance, instanceID =10.0.0.10:account-server:8090

2019-09-19T18:44:35.540+0800 DEBUG servicecenter/sync.go:63 Registered instance successful, instanceID =78bca3e2daca11e99638fa163eca30e0

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

步骤3:结果验证

  1. 此时的HelloServer获取实例成功,并调用了AccountServer的CheckHealth接口

    异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

  2. 分别打开Euraka和ServiceCenter的网页,两个服务中心里均包含了所有的实例信息

    异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

    异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

  3. curl命令调用HelloServer的Login接口

$ curl -X POST /

http://10.0.0.11:8091/login /

-H'Content-Type: application/json' /

-d'{

"user":"Jack",

"password":"123456"

}'

welcome Jack

HelloServer与AccountServer分别会打印如下的信息
AccountServer :

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

HelloServer:

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

未来展望

ServiceCombSyncer在异构层面,目前已支持ServiceCenter、Eureka两个服务中心,在后面的工作中将对接更多的生态,将增加对跨网络的场景的支持。 

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

以上就是今天对Syncer的介绍,后面会持续对Syncer的新特性进行分享,同时也欢迎感兴趣的小伙伴 加入我们 ( https://github.com/search?q=org%3Aapache+servicecomb&unscoped_q=servicecomb ,一起做些有意思的事情。

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

扫码加小助手

对开源开发、 微服务

感兴趣的小伙伴

一起来做些有意思的事情~

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

在看点一下~

异构微服务数据无损通信:Apache ServiceComb syncer完整示例实践

阅读原文

,更多精彩内容!

原文  http://mp.weixin.qq.com/s?__biz=MzUxNTEwNTg5Mg==&mid=2247488578&idx=1&sn=e2bf5bd909ed49c88805b36b2a72ecb0
正文到此结束
Loading...