服务注册与发现
最近更新时间: 2024-09-05 15:09:00
操作场景
该任务指导您在本地开发Spring Cloud微服务示例应用并注册到TSF 服务注册发现中心,或者将已经接入 Eureka 服务注册与发现的应用迁移到TSF 服务注册发现中心。
前提条件
开始实践服务注册发现功能前,请确保已完成 【SDK 下载】。
本地开发应用
创建 tsf-demo 工程,文件结构如下:
|- consumer-demo
|- provider-demo
|- pom.xml
其中pom.xml
文件参考 [Demo 工程概述] 中的pom.xml
内容。
1. 创建服务提供者
在本地创建服务提供者应用工程,此服务提供者提供一个简单的 echo 服务,并将自身注册到服务注册中心。
1.1 创建 provider 工程
创建一个 Spring Cloud 工程,命名为provider-demo
。
1.2 修改 pom 依赖
在pom.xml
中引入需要的依赖内容:
<parent>
<groupId>com.tencent.tsf</groupId>
<artifactId>tsf-demo</artifactId>
<version><!-- 关联 parent version 属性--></version>
</parent>
<artifactId>provider-demo</artifactId>
<packaging>jar</packaging>
<name>provider-demo</name>
<dependencies>
<dependency>
<groupId>com.tencent.tsf</groupId>
<artifactId>spring-cloud-tsf-starter</artifactId>
</dependency>
</dependencies>
注意:
Finchley 版本 SDK 无须添加 monitor 依赖包 。
1.3 开启服务注册发现
添加服务提供端的代码。
// 省略部分 import
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.tsf.annotation.EnableTsf;
@SpringBootApplication
@EnableFeignClients // 使用Feign微服务调用时请启用
@EnableTsf
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
1.4 提供 echo 服务
创建一个EchoController
,提供简单的echo
服务。
@RestController
public class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return string;
}
}
1.5 修改配置
在resource
目录下的application.yml
文件中配置应用名与监听端口号。
server:
port: 18081
spring:
application:
name: provider-demo
注意:
运行在 TSF 平台上的应用无须配置服务注册中心地址,SDK 会通过环境变量自动获取注册中心地址。
2. 创建服务消费者
本小节中,我们将创建一个服务消费者,消费者通过RestTemplate
、AsyncRestTemplate
、FeignClient
这三个客户端去调用服务提供者。
2.1 创建 consumer 工程
创建一个 Spring Cloud 工程,命名为consumer-demo
。
2.2 修改 pom 依赖
在pom.xml
中引入需要的依赖内容:
<parent>
<groupId>com.tencent.tsf</groupId>
<artifactId>tsf-demo</artifactId>
<version><!-- 关联 parent version 属性--></version>
</parent>
<artifactId>consumer-demo</artifactId>
<packaging>jar</packaging>
<name>consumer-demo</name>
<dependencies>
<dependency>
<groupId>com.tencent.tsf</groupId>
<artifactId>spring-cloud-tsf-starter</artifactId>
</dependency>
</dependencies>
2.3 开启服务注册发现
与服务提供者provider-demo
相比,除了开启服务与注册外,还需要添加两项配置才能使用RestTemplate
、AsyncRestTemplate
、FeignClient
这三个客户端:
添加
@LoadBalanced
注解将RestTemplate
与AsyncRestTemplate
与服务发现结合。使用
@EnableFeignClients
注解激活FeignClients
。
// 省略部分 import
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.tsf.annotation.EnableTsf;
import org.springframework.web.client.AsyncRestTemplate;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableFeignClients // 使用 Feign 微服务调用时请启用
@EnableTsf
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) throws InterruptedException {
SpringApplication.run(ConsumerApplication.class, args);
}
}
2.4 设置调用信息
在使用EchoService
的FeignClient
之前,还需要完善它的配置。配置服务名以及方法对应的 HTTP 请求,服务名为provider-demo
工程中配置的服务名provider-demo
,代码如下:
@FeignClient(name = "provider-demo")
public interface EchoService {
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
String echo(@PathVariable("str") String str);
}
2.5 创建 Controller
创建一个Controller
供调用测试。
/echo-rest/*
验证通过 RestTemplate 去调用服务提供者。/echo-async-rest/*
验证通过 AsyncRestTemplate 去调用服务提供者。/echo-feign/*
验证通过 FeignClient 去调用服务提供者。
@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://provider-demo/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://provider-demo/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);
}
}
2.6 修改配置
server:
port: 18083
spring:
application:
name: consumer-demo
注意:
运行在 TSF 平台上的应用无须配置服务注册中心地址,SDK 会通过环境变量自动获取注册中心地址。
3. 部署应用
将打包好的 FatJar 程序包上传到 TSF 控制台,进行部署操作,无需关心额外配置。
从 Eureka 迁移应用
已经接入 Eureka 服务注册与发现的应用,只需要修改pom.xml
依赖,就可以将服务接入 TSF 服务注册发现中心。
在工程根目录的 pom.xml 中增加
spring-cloud-tsf-dependencies
的 parent。参考上文中的 Demo 工程。在单个 Spring Cloud 应用的
pom.xml
中,将spring-cloud-starter-eureka
替换成spring-cloud-tsf-consul-discovery
。
- 替换前:
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-eureka</artifactid>
</dependency>
- 替换后:
<dependency>
<groupid>com.tencent.tsf</groupid>
<artifactid>spring-cloud-tsf-consul-discovery</artifactid>
</dependency>
<!-- consul SDK 依赖的版本控制参考 Demo 或之前 pom 说明-->
- 修改代码中的 Eureka 的相关注解。
@EnableEurekaClient => @EnableDiscoveryClient