前言

腾讯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上:

image.png

点击这个service,可以看到它的地址:192.168.154.1:18081

image.png

浏览器中输入http://192.168.154.1:18081/ec...,就可以看着这个服务的返回信息了:

image.png


槲栎
67 声望1 粉丝