2019獨角獸企業重金招聘Python工程師標準>>>
Spring Cloud是很多組件的集合,Spring將常用的技術框架進行包裝和整合,如mybatis zookeeper rabbitmq redis等等,還有一些科技公司貢獻出來的一些經過生產環境驗證的組件如奈飛公司貢獻出的eureke(服務發現) Hystrix(監控與隔離)? Feign(聲明式服務調用)? Ribbon(負載均衡) Zuul(網關) 等等,詳情移步官網?SpringCloud
Spring Cloud是目前比較流行的微服務開發框架,可以與容器技術如docker一起使用,提高生產力。但是組件過多也有一定的學習曲線,而且適合大公司的架構不見得適合我們的業務,要根據實際情況靈活運用。
Spring Cloud Config是基于git/svn倉庫來管理配置,然后有一個ConfigServer來負責拉取配置,ConfigClient是使用配置的應用,比如現在有很多微服務應用,如訂單管理,用戶管理,地址管理,庫存管理等等,在這些微服務的pom中增加ConfigClient就可以自動從ConfigServer拉取配置。我們還希望配置更新之后可以實時獲取,這時候需要用到spring cloud中的bus組件,bus其實就是基于amqp的一個消息總線,spring對rabbitmq和kafka支持的比較好。常見的場景是:
1、更改配置
2、push到遠程倉庫
3、push動作觸發一個web hook
4、這個web hook會使用post訪問ConfigServer的一個接口
5、ConfigServer通過rabbitmq發送一個廣播
6、client收到消息,自動拉取并刷新配置
這些不需要任何編碼工作,只需要配置就可以。下面是一個簡單的例子。
1、rabbitmq安裝參照官網,十分簡單,也可以參考俺的博客
2、啟動一個Config Server
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>spring_cloud</groupId><artifactId>config_demo</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version></parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config</artifactId><version>2.0.1.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-bus</artifactId><version>2.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId><version>2.0.1.RELEASE</version></dependency></dependencies><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/libs-snapshot</url><snapshots><enabled>true</enabled></snapshots></repository></repositories>
</project>
入口類:
@EnableConfigServer@SpringBootApplicationpublic?class?Application {public?static?void?main(String[] args) {SpringApplication.run(Application.class, args);}}
配置:application.properties
server.port=8888
#配置倉庫地址
spring.cloud.config.server.git.uri=https://github.com/mychemicalromance/spring_cloud_config
## 配置文件夾
spring.cloud.config.server.git.searchPaths=configs
## 分支
spring.cloud.config.label=master
## 以下是bus相關配置 替換成自己的就行,比如host port name password
spring.cloud.bus.trace.enabled=true
spring.rabbitmq.host=192.168.137.5
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=rabbit
management.endpoints.web.exposure.include=*
解釋:Spring Cloud只需要上述入口類就啟動了一個web工程,使用的是嵌入的tomcat/jetty。默認讀取application.[properties|yml|json] 使用喜歡的格式就行。
3、Config Client
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>spring_cloud</groupId><artifactId>config_client</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version></parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config</artifactId><version>2.0.1.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-bus</artifactId><version>2.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId><version>2.0.1.RELEASE</version></dependency></dependencies><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/libs-snapshot</url><snapshots><enabled>true</enabled></snapshots></repository></repositories>
</project>
入口類:
@Configuration
@EnableAutoConfiguration
@RestController
@RefreshScope
public class Application {@Value("${a}")String name;@RequestMapping("/")public String home() {return "Hello " + name;}public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
配置:application.properties
server.port=8002
## bus相關配置,替換成自己的就行,比如host port name password
spring.cloud.bus.trace.enabled=true
spring.rabbitmq.host=192.168.137.5
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=rabbit
## 讀取app1的配置
spring.application.name=app1
## profile是dev,可以有測試test,沙箱mirror,線上online等等
spring.cloud.config.profile=dev
management.endpoints.web.exposure.include=*
3、啟動Config Server和Config Client,首先訪問localhost:8888/app1/dev,可以看到所有配置,然后訪問localhost:8002/可以看到獲取了配置。然后本地更改配置文件并push。由于在github上配置web hook來調用本地是不現實的,所以我們用curl來模擬post訪問Config Server,如果是在公司的git上,并且在公司局域網內可以訪問Config Server,可以配置web hook來測試。
curl -X POST "http://localhost:8888/actuator/bus-refresh"
然后刷新Config Client,就能看到最新的配置了。