Spring Cloud 是在 Spring Boot 之上構建的一套微服務生態體系,包括服務發現、配置中心、限流降級、分布式事務、異步消息等,因此通過增加依賴、注解等簡單的四步即可完成 Spring Boot 應用到 Spring Cloud 升級。
Spring Boot 應用升級為 Spring Cloud
Cloud Native
以下是應用升級 Spring Cloud 的完整步驟。
第一步:添加 Spring Cloud 依賴
首先,為應用添加 Spring Cloud 與 Spring Cloud Alibaba 依賴。注意根據當前應用 Spring Boot 版本選擇合適的 Spring Cloud 版本,具體參見版本映射表[1]。??????
<properties>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Nacos 服務發現 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 服務發現:OpenFeign服務調用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 服務發現:OpenFeign服務調用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
以上我們添加了服務注冊發現、OpenFeign 等依賴。
第二步:添加配置
在應用 application.yml 或者 application.properties 文件中增加以下配置項,設置應用名、注冊中心地址。
application.yml:
spring:
application:
#項目名稱必填,在注冊中心唯一
#最好和之前域名規范、kubernetes service名等保持一致(會作為調用與負載均衡依據)
name: service-provider
cloud:
nacos:
discovery: #啟用 spring cloud nacos discovery
server-addr: 127.0.0.1:8848
application.properties:???????
#項目名稱必填,在注冊中心唯一
#最好和之前域名規范、kubernetes service名等保持一致(會作為調用與負載均衡依據)
spring.application.name=service-provider
#啟用 spring cloud nacos discovery
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
第三步:啟動類增加注解
啟動類增加 EnableDiscoveryClient EnableFeignClients 注解,啟動服務地址自動注冊與發現。???????
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
第四步:調整服務調用方式
🔔 注意!
1. 為了保證平滑升級,請確保下游應用完成 Spring Cloud 改造并在注冊中心注冊服務后再進行調用方式改造。
2. RestTemplate/FeignClient 默認發起調用的 hostname (示例中的 service-provider)是對端 Spring Cloud 應用名。因此,為了保證盡可能少的改造量,改造過程中設置的應用名 spring.name=service-provider 最好和之前的命名規范保持一致。比如:
-
-
如果之前有自定義域名,則和域名定義保持一致
-
如果之前用的 Kubernetes Service,則和 Service Name 保持一致
-
1. RestTemplate 模式
為之前的 RestTemplate Bean 添加 @LoadBlanced 注解,使得 RestTemplate 接入服務發現與負載均衡:??????
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
其它原有 RestTemplate 發起調用的代碼保持不變,只需調整 hostname 即可,如下所示。???????
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/echo-rest/{str}")
public String rest(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
}
2. FeignClient 模式
使用 @FeignClient 注解將 EchoService 這個接口包裝成一個 FeignClient,屬性 name 對應對端應用名 spring.name=service-provider。??????
//@FeignClient(name = "service-provider", url="http://service.example.com/")
@FeignClient(name = "service-provider")
public interface EchoService {
@GetMapping(value = "/echo/{str}")
String echo(@PathVariable("str") String str);
}
將 EchoService 作為標準 bean 注入,即可對遠端服務發起請求了。???????
@RestController
public class TestController {
@Autowired
private EchoService echoService;
@GetMapping(value = "/echo-feign/{str}")
public String feign(@PathVariable String str) {
return echoService.echo(str);
}
}
3. HtClient、自定義 HTTP 訪問工具等
對于使用 HttpClient 或者自行封裝 http 調用工具的用戶,建議統一改造為以上 1、2 兩種調用模式之一。