在入門 SpringCloudAlibaba 時在網上有噴這門技術的有對技術保持敬畏的下面推薦幾篇文章很有意思
- (坑爹項目「spring-cloud-alibaba」,我們也來一個)https://juejin.im/post/5ca723696fb9a05e20221c78
- (Spring Cloud Alibaba到底坑不坑?)https://www.cnblogs.com/didispace/p/10675601.html
- (說說我爲什麼看好Spring Cloud Alibaba)http://blog.didispace.com/spring-cloud-alibaba-significance/
下面是我從網上找來的一些 SpringCloud 和 SpringCloudAlibaba 技術棧的不同
先來啓動 SpringCloudAlibaba 的註冊中心 Nacos 這個很簡單可以參照 nacos 官網進行
https://nacos.io/zh-cn/docs/quick-start.html
編寫一個服務提供者
首先需要導入相關依賴
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<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>
在配置文件中指定服務註冊中心
server.port=8081
spring.application.name=nacos-server-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
在啓動類中添加註解並編寫一個基礎服務
@SpringBootApplication
@EnableDiscoveryClient
public class NacosserverApplication {
public static void main(String[] args) {
SpringApplication.run(NacosserverApplication.class, args);
}
@Data
@RestController
class EchoController {
@Value("${server.port}")
private String port;
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return string + "(" + port + ")";
}
}
}
下面我們編寫服務消費者
- 導入和服務提供者相同的依賴如果選擇 Feign 來作服務直接的交互就導入 Feign 的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 配置註冊中心
server.port=8082
spring.application.name=nacos-server-caller
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
- 在入口程序添加註解並注入bean
/**
* 如果使用 Feign 來進行調用需要添加 @EnableFeignClients 否則不需要
*/
@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
public class NacosserverclientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosserverclientApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
編寫 Controller 進行服務消費
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/echo-rest/{str}")
public String rest(@PathVariable String str) {
return "rest::" + restTemplate.getForObject("http://nacos-server-provider/echo/" + str, String.class);
}
@Autowired(required = true)
private NacosServerProvider nacosServerProvider;
@GetMapping(value = "/echo-feign/{str}")
public String feign(@PathVariable String str) {
return nacosServerProvider.echo(str);
}
}
NacosServerProvider 接口
@Repository
@FeignClient(name = "nacos-server-provider")
public interface NacosServerProvider {
@GetMapping("/echo/{str}")
String echo(@PathVariable("str") String str);
}
Nacos 的這個下線功能很有意思
- 他只是在邏輯層面上對服務進行了下線
- 也就是說當服務消費者向服務提供者發起請求時不會選擇下線了的服務
通過 Nacos 來對服務的配置進行動態加載
直接基於以上代碼進行更改在服務提供者中添加依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
在 resources 目錄下創建 bootstrap.yml 文件並添加配置
spring:
application:
name: nacos-server-provider
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
在配置文件類中添加 @RefreshScope 註解
@Data
@RestController
@RefreshScope
public class EchoController {
@Value("${server.port}")
private String port;
// ${<配置文件中的key>:<配置文件中沒有key時的默認值>} 默認情況下如果key沒有找到就會在初始化時報錯
@Value("${time:10}")
private String time;
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return string + "(" + port + "):[time:" + time +"]";
}
}
在 Nacos 中添加配置文件
- DataID 的值爲: <bootstrap文件中配置的項目名>-<項目環境>.<配置文件類型>
- 然後在Nacos配置文件中修改值就會刷新到項目中了