ServiceComb ServiceCenter 新的版本即将发布,在此次发版中将带来异构、多服务中心同步工具 Syncer,在这里将从咱们的已有的实践经验出发,带来对Syncer的介绍。
项目地址:https://github.com/apache/servicecomb-service-center/tree/master/syncerhtml
从传统架构到微服务,为了解决微服务之间动态变动带来的问题,各微服务框架百花齐放,从而衍生出Service-center、eureka、consul等一系列服务中心;在云环境大行其道的今天,公/私有云并存、混合云部署在企业实践中彷佛已成为趋势。在这过程当中不得不面临一些问题:java
在最初的项目中,咱们应用了ServiceCenter的中心化解决方案 ServiceCenter Aggregate,详细介绍请参考:https://github.com/apache/servicecomb-service-center/blob/master/docs/multidcs.md。在使用这样的中心化解决方案后,异构服务中心的实例被同步到 Aggregate 中,服务只需指定服务发现地址到 Aggregate,便可实现对异构、跨区域实例的发现,同时也支持了微服务架构之间的平滑迁移。
通过一段时间的使用,集中式、中心化方案的不足逐渐显现,因而便有了以下的思考:linux
针对以上的问题与思考,咱们带来了无中心化的解决方案 Apche ServiceComb Syncer。Syncer是一个多服务中心的同步工具,专为大型微服务架构设计,用于在网络互通的状况下,不一样技术栈服务中心、跨区域的实例同步,将来将对跨网络、跨云等场景提供支持。git
Syncer以服务中心的伴生系统的形式而存在,主要负责从当前服务中心发现实例,并向网络其余成员进行广播;接收其余成员的广播,并拉取实例信息向当前服务中心进行注册。Syncer 有以下特色:github
下面咱们经过具体的业务流程来进一步了解 Syncer。golang
上图左侧绿色 SyncerN 是一个待加入网络的成员。web
Syncer的同步流程同步流程并不复杂,下图具体描述了两个Syncer将不一样服务中心的实例进行同步的过程。
适用场景spring
上图左,两套服务中心(ServiceCenter 和 Eureka)各自为政,各自辖区的服务没法跨越架构边界,没法发现对方服务实例,从而没法进行通信。上图右,两套服务中心的实例将经过 Syncer 同步,在两个服务中内心,最后都将呈现出全部的实例,服务之间无障碍发现,从而实现实例的共享通信。apache
syncer统一了同步数据结构 SyncData,并以插件的形式提供对各服务中心的支持,各服务中心只需实现实例数据与 SyncData 的转换,便可完成异构服务中心数据的转换。从而在架构迁移的过程当中,可使用 syncer 实现系统的逐步迁移,平稳过渡。json
在企业的发展道路中,常常会出现因为某个核心服务使用了某个技术栈,致使与其对接的服务只能迁就,从而放弃更适合的选型。Syncer 支持异构同步的特性,能够有效冲破这个限制,使业务选型听从业务自己诉求。
下面咱们将经过一个异构服务中心同步的示例,从实践出发进一步了解 Syncer。
示例代码:https://github.com/apache/servicecomb-service-center/blob/master/syncer/samples/multi-servicecenters
本案例模拟了异构服务中心之间的通信场景,包括如下四个部分:
机器: 10.0.0.10
# 记录当前目录
$ project_dir=`pwd`
# 下载源码
$ git clone https://github.com/apache/servicecomb-service-center.git
# 编译 Syncer
$ cd servicecomb-service-center/syncer $ GO111MODULE=on go build
# 编译 EurekaServer 和 AccountServer
$ cd samples/multi-servicecenters/eureka $ mvn clean install
文件位置:${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,若出现以下页面,则启动成功
文件位置:${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已经注册成功
$ cd ${project_dir}/servicecomb-service-center/syncer $ ./syncer daemon --sc-addr http://10.0.0.10:8761/eureka --bind-addr 10.0.0.10:30190 --rpc-addr 10.0.0.10:30191 --sc-plugin=eureka
# 出现以下字样则为成功
2019-09-19T17:28:28.809+0800 INFO etcd/agent.go:55 start etcd success 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
机器: 10.0.0.11
# 记录当前目录
$ project_dir=`pwd`
# 下载源码
$ git clone https://github.com/apache/servicecomb-service-center.git
# 编译 Syncer
$ cd servicecomb-service-center/syncer $ GO111MODULE=on go build
# 编译 HelloServer
$ cd samples/multi-servicecenters/servicecenter/hello-server/ $ GO111MODULE=on go build
$ cd ${project_dir}
# 下载 ServiceCenter 1.2.0版本包
$ curl -O https://mirrors.tuna.tsinghua.edu.cn/apache/servicecomb/servicecomb-service-center/1.2.0/apache-servicecomb-service-center-1.2.0-linux-amd64.tar.gz $ tar -zxvf apache-servicecomb-service-center-1.2.0-linux-amd64.tar.gz
文件位置:${project_dir}/apache-servicecomb-service-center-1.2.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 set the 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 # ...如下省略...
浏览器打开http://10.0.0.11:30103,若出现以下页面,则启动成功
文件位置:${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
$ 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已经注册成功
但因为没法发现属于Eureka服务中心的AccountServer实例,HelloServer处于重试状态
(注:重试次数为3次,每次间隔30秒,因此咱们须要在90秒内完成后面的操做)
$ cd ${project_dir}/servicecomb-service-center/syncer $ ./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 xxxxxb 10.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:87 create service success orgServiceID= account-server, curServiceID = 80784229255ec96d90353e3c041bdf3586fdbbae 2019-09-19T18:44:35.538+0800 DEBUG servicecenter/servicecenter.go:90 trying 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
1.此时的HelloServer获取实例成功,并调用了AccountServer的CheckHealth接口
2.分别打开Euraka和ServiceCenter的网页,两个服务中内心均包含了全部的实例信息
$ curl -X POST \ http://192.168.88.75:8091/login \ -H 'Content-Type: application/json' \ -d '{ "user":"Jack", "password":"123456" }' welcome Jack
HelloServer与AccountServer分别会打印以下的信息
AccountServer :
HelloServer:
ServiceComb Syncer在异构层面,目前已支持ServiceCenter、Eureka两个服务中心,在后面的工做中将对接更多的生态,将增长对跨网络的场景的支持。
以上就是今天对Syncer的介绍,后面会持续对Syncer的新特性进行分享,同时也欢迎感兴趣的小伙伴加入咱们,一块儿作些有意思的事情。