前言
腾讯TSF和Dubbo都对微服务进行支持。根据Spring Cloud 微服务架构学习笔记与示例中的描述,Dubbo是第一代微服务,SpringCloud是第二代,Service Mesh是第三代。
TSF拥抱 Spring Cloud 、Service Mesh 微服务框架,并且提供Dubbo应用接入TSF
简要介绍下dubbo、Spring Cloud和TSF。由于dubbo应用可以直接迁移到TSF,所以对Spring Cloud可以不看。
1. Dubbo
Dubbo支持的微服务使用zookeeper作为注册中心。服务提供者把服务发布到zookeeper,服务调用者从zookeeper获取服务地址,然后调用服务。
dubbo主页,示例参考dubbo-samples
1.1 API方式
不使用Spring,通过Java API调用,直接发布和获取服务。示例代码dubbo-samples-api
Provider:
ServiceConfig<GreetingsService> service = new ServiceConfig<>();
service.setApplication(new ApplicationConfig("first-dubbo-provider"));
service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
service.setInterface(GreetingsService.class);
service.setRef(new GreetingsServiceImpl());
service.export();
Consumer:
ReferenceConfig<GreetingsService> reference = new ReferenceConfig<>();
reference.setApplication(new ApplicationConfig("first-dubbo-consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
reference.setInterface(GreetingsService.class);
GreetingsService service = reference.get();
String message = service.sayHi("dubbo");
1.2 Spring方式
通过Spring配置文件进行设置,进行服务的发布和获取。获取到bean之后,就可以进行微服务调用。示例代码dubbo-samples-basic
provider:
<dubbo:application name="demo-provider"/>
<dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>
<bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
<dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
consumer:
<dubbo:application name="demo-consumer"/>
<dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>
<dubbo:reference id="demoService" check="true" interface="org.apache.dubbo.samples.basic.api.DemoService"/>
2. Spring Cloud
Spring Cloud是基于Spring boot的,很好地整合了和微服务相关的一系列框架
Spring Cloud使用了Eureka作为服务注册中心(和zookeeper的地位类似,Spring Cloud也可以使用zookeeper做服务注册中心)
Spring Cloud的服务调用方式一般是REST风格的,这和Dubbo不太相同。Spring Cloud并不需要服务提供者的Interface组成的jar包,只需要知道其REST API即可。
Spring Cloud代码中大量使用注解和自动配置,需要对spring boot熟悉之后才能更好地理解Spring Cloud的代码
未深入研究
2.1 示例
参考Spring Cloud超简单十分钟入门实例,代码地址spring-cloudd-sample,对代码的说明README.MD
注册中心: Eureka Server
在Spring boot程序中,使用@EnableEurekaServer
注解启动Eurekak Server,浏览器中输入http://localhost:8761/,可以看到Eureka的界面
一个服务提供者: hello-service
- @EnableDiscoveryClient: Eureka Server的客户端。无论是服务提供者还是消费者,都是Eureka的客户端,连接到Eureka上,提供微服务,或者获取微服务。
- @RestController: REST风格
- @RequestMapping("/hi"): 把地址映射到某个函数。通过连接这个地址,就可以调用这个函数
- application.yml: 配置文件中开发了端口8763。这样,就在Eureka上发布了一个微服务,其ip是Eureka的地址,端口是8763,API是REST风格的/hi。例如,浏览器中输入http://localhost:8763/hi,就可以调用
@RequestMapping("/hi")
所标记的函数
一个服务消费者,同时也是服务提供者:call-service
服务消费者部分:
- @EnableDiscoveryClient: 连接到Eureka上获取服务
- @FeignClient(value = "hello-service"): 使用Feign(一个声明式服务调用组件)注解,随便顶一个一个Interface,指明需要使用
hello-service
这个微服务。这个接口会被自动发现为一个Bean,对这个Bean进行操作,就可以调用hello-service
这个微服务了 - @RequestMapping("/hi"): 使用这个注解,表明函数需要调用
hello-service
的/hi
API
注意这里的consumer只需知道provider的服务名(hello-service)和API名(/hi),就可以完成微服务的调用,不需要引入服务提供者的任何jar包
服务提供者部分:和hello-service类似。它也提供了一个服务call-service
路由: api-gateway
使用ZUUL提供路由服务
- @EnableDiscoveryClient: 连接到Eureka服务器
- @EnableZuulProxy: 启用ZUUL路由服务
- application.yml中,配置了路由策略,开放8769端口。使一个端口路由到不同的服务。例如
http://localhost:8769/hello/
路由到hello-service
服务,http://localhost:8769/call/
路由到call-service
服务
3. 腾讯TSF
基于Spring Cloud框架,提供了和微服务相关的全套解决方案
3.1 Spring Cloud方式的服务注册和调用
代码在tsf-simple-demo,大量使用注解,未作深入研究。
主要是使用@EnableTsf
注解,启动TSF服务。其它和Spring Cloud类似
编译之前需配置maven环境.m2/setting.xml,参看Maven配置
3.2 Dubbo迁移到TSF
参考Dubbo Demo 工程概述,代码需在此页面下载。
示例代码虽然使用spring boot,但根本上还是使用的spring方式的xml文件。需要在dubbo配置文件中,把注册地址修改为TSF地址:
<dubbo:registry address="tsfconsul://127.0.0.1:8500" />
把依赖改为tsf-dubbo的SDK,即可完成迁移。
TSF在这里使用的使Consul作为注册中心,和zookeeper、Eureka类似
3.3 本地开发联调
参考轻量级服务注册中心,在本地下载和安装Consul,进行开发调试
参考本地开发联调,进行启动参数设置
编译好的程序需上传到TSF平台上运行,参看服务注册与发现
3.3.1 安装Consul
执行命令docker pull consul
在docker中安装consul:
[eric@centos7min2 ~]$ docker pull consul
Using default tag: latest
latest: Pulling from library/consul
9123ac7c32f7: Pull complete
e86f60c5bca7: Pull complete
797d2b209b11: Pull complete
d0c8a484f6b6: Pull complete
f6170620a1ae: Pull complete
1cf6b979311c: Pull complete
Digest: sha256:3e064c7f96231a95677a7d7af603ef99a8ca4d63d46a70e25de794c9fc392ea2
Status: Downloaded newer image for consul:latest
docker.io/library/consul:latest
执行命令docker run -d --name=dev-consul -p 8500:8500 consul
启动consul。启动之后,可以在http://ip:8500/上看到consul的web页面。其中IP为docker所在机器的地址。
3.3.2 启动provider
启动tsf-simple-demo中的provider-demo,按照本地开发联调中的说明,设置JVM启动参数-Dtsf_consul_ip=192.168.56.104 -Dtsf_consul_port=8500 -Dtsf_application_id=a -Dtsf_group_id=b -Dtsf.swagger.enabled=false
,运行ProviderApplication。再打开consul的web页面,就可以看到这个服务已经注册到了consul上:
点击这个service,可以看到它的地址:192.168.154.1:18081
浏览器中输入http://192.168.154.1:18081/ec...,就可以看着这个服务的返回信息了:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。