在HSF框架中开发RESTful应用,并实现服务注册与发现。由于EDAS已经支持原生Spring Cloud框架的应用,新用户不推荐使用该开发方式。
背景信息
原生Spring Cloud框架下的服务开发请参考实现服务注册与发现。
服务注册与发现
通过一个简单的示例详细介绍如何在本地开发RESTful应用并实现注册与发现。
- 创建服务提供者。此服务提供者提供了一个简单的echo服务,并将自身注册到服务发现中心。
- 创建命名为sc-vip-server的RESTful应用工程。
- 在pom.xml中添加需要的依赖。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vipclient</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
如果您的工程不想将parent设置为
spring-boot-starter-parent
,也可以通过添加dependencyManagement
并设置scope=import
来达到依赖管理的效果。<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.8.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 创建服务提供者应用,其中@EnableDiscoveryClient 注解表明此应用需开启服务注册与发现功能。
@SpringBootApplication @EnableDiscoveryClient public class ServerApplication { public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ServerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } }
- 创建EchoController,提供简单的echo服务。
@RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } }
- 在resources下的application.properties文件中配置应用名与监听端口号。
spring.application.name=service-provider server.port=18081
- 创建服务消费者。本示例中将创建一个服务消费者,通过RestTemplate、AsyncRestTemplate、FeignClient这三个客户端去调用服务提供者。
- 创建名为sc-vip-client的RESTful应用工程。
- 在pom.xml中引入需要的依赖。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vipclient</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
本示例需要通过FeignClient进行演示,与sc-vip-server(服务提供者)相比,pom.xml文件中的依赖增加了
spring-cloud-starter-feign
。 - 与sc-vip-server相比,除了开启服务与注册外,还需要添加下面两项配置才能使用RestTemplate、AsyncRestTemplate、FeignClient这三个客户端。
- 添加@LoadBalanced注解将RestTemplate和AsyncRestTemplate与服务发现结合。
- 使用@EnableFeignClients注解激活FeignClient。
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @LoadBalanced @Bean public AsyncRestTemplate asyncRestTemplate(){ return new AsyncRestTemplate(); } public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ConsumerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } }
- 在使用EchoService的FeignClient之前,还需要配置服务名以及方法对应的HTTP请求。在sc-vip-server工程中配置服务名service-provider。
@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); }
- 创建一个Controller用于调用测试。
@RestController public class Controller { @Autowired private RestTemplate restTemplate; @Autowired private AsyncRestTemplate asyncRestTemplate; @Autowired private EchoService echoService; @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET) public String rest(@PathVariable String str) { return restTemplate.getForObject("http://service-provider/echo/" + str, String.class); } @RequestMapping(value = "/echo-async-rest/{str}", method = RequestMethod.GET) public String asyncRest(@PathVariable String str) throws Exception{ ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate. getForEntity("http://service-provider/echo/"+str, String.class); return future.get().getBody(); } @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } }
代码说明如下:/echo-rest/
验证通过RestTemplate去调用服务提供者。/echo-async-rest/
验证通过AsyncRestTemplate去调用服务提供者。/echo-feign/
验证通过FeignClient去调用服务提供者。
- 配置应用名以及监听端口号。
spring.application.name=service-consumer server.port=18082
- 本地开发调试。
- 启动轻量级配置中心。本地开发调试时,需要使用轻量级配置中心,轻量级配置中心包含了EDAS服务注册发现服务端的轻量版,详情请参见启动轻量级配置及注册中心。
- 启动应用。
- IDE中启动
在IDE中启动,通过VM options配置启动参数
-Dvipserver.server.port=8080
(注意:该参数仅在本地开发且使用轻量级配置中心时需要添加,当应用部署到EDAS时,须移除此参数,否则会使应用无法正常发布或订阅),通过main方法直接启动。轻量级配置中心与应用部署在不同的机器上,需要绑定hosts,详情请参见启动轻量级配置及注册中心。
- FatJar启动
- 添加FatJar打包插件。
使用Maven将pandora-boot工程打包成FatJar, 需要在pom.xml中添加如下插件。为避免与其他打包插件发生冲突,请勿在build的plugin中添加其他FatJar插件。
<build> <plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </build>
- 添加完插件后,在工程的主目录下,使用Maven命令
mvn clean package
进行打包,即可在target目录下找到打包好的FatJar文件。 - 通过Java命令启动应用。
java -Dvipserver.server.port=8080 -Dpandora.location=/Users/{$username}/.m2/repository/com/taobao/pandora/taobao-hsf.sar/dev-SNAPSHOT/taobao-hsf.sar-dev-SNAPSHOT.jar -jar sc-vip-server-0.0.1-SNAPSHOT.jar
说明-Dpandora.location
指定的路径必须是全路径,且必须放在sc-vip-server-0.0.1-SNAPSHOT.jar之前。
- 添加FatJar打包插件。
启动服务,分别进行调用,可以看到调用都成功了。 - IDE中启动
- 启动轻量级配置中心。
- 常见问题处理。
- AsyncRestTemplate无法接入服务发现。
AsyncRestTemplate接入服务发现的时间比较晚,需要在Dalston之后的版本才能使用,相关内容,请参见pull request。
- FatJar打包插件冲突。
为避免与其他打包插件发生冲突,请勿在build的plugin中添加其他FatJar插件。
- 打包时可不可以不排除taobao-hsf.sar?
可以,但是不建议这么做。
通过修改pandora-boot-maven-plugin插件,把excludeSar设置为false,打包时就会自动包含taobao-hsf.sar。<plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <configuration> <excludeSar>false</excludeSar> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
这样打包后可以在不配置Pandora地址的情况下启动。java -jar -Dvipserver.server.port=8080 sc-vip-server-0.0.1-SNAPSHOT.jar
请在将应用部署到EDAS前恢复到默认排除SAR包的配置。
- AsyncRestTemplate无法接入服务发现。
全链路跟踪
您可以在本地对您的RESTful应用经过简单的修改接入到EDAS的EagleEye,从而实现全链路跟踪。
为了节约您的开发成本和提升您的开发效率,EDAS提供了全链路跟踪的组件EagleEye。您只需在代码中配置EagleEye埋点,即可直接使用EDAS的全链路跟踪功能,无需关心日志采集、分析、存储等过程。
接入EagleEye
- 在Maven中配置EDAS的私服地址。目前Pandora Boot Starter相关的包只发布在EDAS的私服中,所以需要在Maven(要求3.x及后续版本)配置文件settings.xml中配置EDAS的私服地址,详情请参见配置EDAS的私服地址和轻量级配置及注册中心。
- 修改代码。RESTful应用接入EDAS的EagleEye很简单,只需要完成以下三步。
- 在pom.xml文件中加入如下公共配置。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eagleeye</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency>
- 在main函数中添加修改配置。假设修改之前的main函数内容如下:
则修改为:public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); }
public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ServerApplication.class, args); PandoraBootstrap.markStartupAndWait(); }
- 添加FatJar打包插件。使用Maven将pandora-boot工程打包成FatJar, 需要在pom.xml中添加如下插件。
为避免与其他打包插件发生冲突,请勿在build的plugin中添加其它FatJar插件。
<build> <plugins> <plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
完成上述三处修改后,您无需搭建任何采集分析系统,即可直接使用EDAS的全链路跟踪功能。
- 在pom.xml文件中加入如下公共配置。
全链路跟踪示例
为了演示如何使用全链路跟踪功能 ,这里提供两个应用Demo:service1、service2
service1用作入口的服务,提供了三个场景演示的入口:
- /rest/ok,对应正常的调用
- /rest/delay,对应延迟较大的调用
- /rest/error,对应异常出错的调用
- 部署应用。EagleEye的采集和分析功能都搭建在EDAS上,为了演示调用链查看功能,我们首先将service1和service2这两个应用部署到EDAS中,具体详情请参见如下文档:
- ECS集群:在ECS集群中创建并部署应用。
- K8s集群:在K8s集群中使用镜像部署Java微服务应用。
- 查看服务调用链。部署完毕之后,为了能够查看调用链的信息,我们还需要调用service1三个场景演示的入口对应的方法。您可以通过执行
curl http://{$ip:$port}/rest/ok
这种简单的方式来调用。也可以使用postman等工具或者直接在浏览器中调用。为了便于观察,建议使用脚本等方式多调用几次。然后按以下步骤查看调用链。- 登录EDAS控制台,进入刚刚部署的应用中
- 在应用详情页面左侧的导航栏中选择应用监控 > 接口调用。
- 在接口调用页面进行查看。
更详细的使用信息,请参见接口调用。
- 其他客户端的演示。同时,在service1的 /echo-rest/{str} 、 /echo-async-rest/{str} 、 /echo-feign/{str} 这三个URI中,分别演示了EagleEye对RestTemplate、AsyncRestTemplate、FeignClient的自动埋点支持,您可以在调用后,通过同样的方式查看着这三者的调用链信息
相关内容
- 埋点支持
目前EDAS的EagleEye已经支持自动对RestTemplate、AsyncRestTemplate、FeignClient调用的请求自动进行跟踪。后续我们将接入更多的组件的自动埋点。
- AsyncRestTemplate
由于AsyncRestTemplate需要在类实例化的阶段进行埋点支持的修改,所以如果需要使用全链路跟踪功能,需要按名称注入对象,eagleEyeAsyncRestTemplate,此对象默认添加了服务发现的支持。
@Autowired private AsyncRestTemplate eagleEyeAsyncRestTemplate;
- FatJar打包插件
使用Maven将pandora-boot工程打包成FatJar, 需要在pom.xml中添加pandora-boot-maven-plugin的打包插件。为避免与其他打包插件发生冲突,请勿在build的plugin中添加其他FatJar插件。