SpringCloud從看不懂到放棄,第五章
一、zuul路由網關
1、zuul概述
簡述:外部接口的統一訪問網關.
Zuul包含了對請求的路由和過濾兩個最主要的功能:
其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎.Zuul和Eureka進行整合,將Zuul自身註冊爲Eureka服務治理下的應用,同時從Eureka中獲得其他微服務的消息,也即以後的訪問微服務都是通過Zuul跳轉後獲得。
注意:Zuul服務最終還是會註冊進Eureka
提供=代理+路由+過濾三大功能
2、zuul基本配置
1》、新建cloud-zuul-9527 module
2》、POM
zuul服務也是要整合進eureka中的
<dependencies>
<!-- zuul路由網關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- actuator監控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- hystrix容錯-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 日常標配 -->
<dependency>
<groupId>com.lee</groupId>
<artifactId>cloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</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-test</artifactId>
</dependency>
<!-- 熱部署插件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
3》、YML新增
server:
port: 9527
spring:
application:
name: cloud-zuul-gateway
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
info:
app.name: cloud
author.name: lee
app.function: 網關
build.artifactId: $project.artifactId$
build.version: $project.version$
4》、HOST配置修改
127.0.0.1 zuul9527.com
5》、主啓動類
package com.lee.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class Zuul_9527_App {
public static void main(String[] args) {
SpringApplication.run(Zuul_9527_App.class,args);
}
}
測試:
①、啓動3個eureka集羣
②、啓動cloud-provider-dept-8001服務提供者
③、一個路由cloud-zuul-9527
④、訪問:
不用路由:http://localhost:8001/dept/get/1
啓用路由:http://zuul9527.com:9527/cloud-dept/dept/get/1
注意:zuul和feign或ribbon沒有多大關係。feign、ribbon http://localhost7001/consumer/xxx之類的訪問和zuul.com:9521/cloud-dept/xxxx訪問沒有關係。在實際項目中feign\ribbon這些服務的消費方一般也是以服務的提供發而存在的。
3、zuul路由訪問映射規則
3.1>、原因:
before:
http://zuul9527.com:9527/cloud-dept/dept/get/1訪問路徑中cloud-dept微服務名稱容易暴露出來,所以我們要將其隱藏置換。
修改:YML
zuul:
routes:
mydept.serviceId: microservicecloud-dept #微服務實例名稱
mydept.path: /mydept/** #映射名稱
測試:
http://zuul9527.com:9527/mydept/dept/list
3.2>、原因:
before:
http://zuul9527.com:9527/cloud-dept/dept/get/1 還能看到,上面這一步只做了置換,沒做隱藏
修改YML
忽略單個:
zuul:
ignored-services: cloud-dept
忽略多個:
zuul:
ignored-services: "*"
測試:
http://zuul9527.com:9527/cloud-dept/dept/get/1
3.3>、原因:
設置一個公共的前綴名
修改YML
zuul:
prefix: /lee
測試:
http://zuul9527.com:9527/lee/mydept/dept/list
如果這樣訪問不了,可能是yml的問題,在POM文件中引入
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.25</version>
</dependency>
即可
二、分佈式配置中心
1、概述
原因:
微服務意味着要將單體應用中的業務拆分成一個個子服務,每個服務的粒度相對較小,因此係統中會出現大量的服務。由於每個服務都需要必要的配置信息才能運行,所以一套集中式的、動態的配置管理設施是必不可少的。SpringCloud提供了ConfigServer來解決這個問題,我們每一個微服務自己帶着一個application.yml,上百個配置文件的管理....../(ㄒoㄒ)/~~
是什麼
SpringCloud Config爲微服務架構中的微服務提供集中化的外部配置支持,配置服務器爲各個不同微服務應用的所有環境提供了一箇中心化的外部配置。
怎麼玩
SpringCloud Config分爲服務端和客戶端兩部分。
服務端也稱爲分佈式配置中心,它是一個獨立的微服務應用,用來連接配置服務器併爲客戶端提供獲取配置信息,加密/解密信息等訪問接口
客戶端則是通過指定的配置中心來管理應用資源,以及與業務相關的配置內容,並在啓動的時候從配置中心獲取和加載配置信息配置服務器默認採用git來存儲配置信息,這樣就有助於對環境配置進行版本管理,並且可以通過git客戶端工具來方便的管理和訪問配置內容。
springcloud config 分佈式配置中心能幹嘛:
1》、集中管理配置文件
2》、不同環境不同配置,動態化的配置更新,分環境部署:比如dev/test/prod/beta/release
3》、運行期間動態調整配置,不再需要在每個服務部署的機器上編寫配置文件,服務會向配置中心統一拉去配置自己的信息
4》、當配置發生變動時,服務不需要重啓即可感知到配置的變化並應用新的配置
5》、將配置信息以rest接口的形式暴露
2、與Gitee碼雲通訊
2.1》、config server服務端配置
①、先在gitee上新建一個cloud-config的新repository
②、獲得SSH協議的Git地址
③、本地硬盤目錄上新建Git倉庫並clone
git clone xxxxxxxxxxxxxxxxxxxxxxxxxxx.git
④、新建一個application.yml(文件內容保存的格式一定要UTF-8)
spring:
profiles:
active:
- dev
---
spring:
profiles: dev #開發環境
application:
name: cloud-config-lee-dev
---
spring:
profiles: test #測試環境
application:
name: cloud-config-lee-test
# 請保存爲UTF-8格式
⑤、將上yml文件推送到gitee上
git status #查看狀態
git add .
git commit -m "init file"
git push origin master
⑥、新建module模塊 cloud-config-3344配置中心模塊
⑦、POM
<dependencies>
<!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 避免Config的Git插件報錯:org/eclipse/jgit/api/TransportConfigCallback -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>4.10.0.201712302008-r</version>
</dependency>
<!-- 圖形化監控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 熔斷 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</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-test</artifactId>
</dependency>
<!-- 熱部署插件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
⑧、yml
server:
port: 3344
spring:
application:
name: cloud-config
cloud:
config:
server:
git:
uri: https://gitee.com/night_wish/cloud-config.git #Gitee上面的git倉庫名字https
username: xxxxx
password: ooooo
⑨、主啓動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class Config_3344_App
{
public static void main(String[] args)
{
SpringApplication.run(Config_3344_App.class,args);
}
}
⑩、修改HOST
127.0.0.1 config3344.com
①①、啓動config 測試是否可以從gitee上獲取配置內容
http://config3344.com:3344/application-dev.yml
http://config3344.com:3344/application-test.yml
http://config3344.com:3344/application-xxxxx.yml
或
http://config3344.com:3344/application/dev/master
http://config3344.com:3344/application/test/master
http://config3344.com:3344/application/xxxxx/master
2.2》、config client客戶端的配置
①、在config server本地目錄下創建cloud-config-client.yml
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: cloud-config-client
eureka:
client:
service-url:
defaultZone: http://eureka-dev.com:7001/eureka/
---
server:
port: 8202
spring:
profiles: test
application:
name: cloud-config-client
eureka:
client:
service-url:
defaultZone: http://eureka-test.com:7001/eureka/
②、將cloud-config-client.yml提交到gitee中
git status
git add .
git commit -m "cloud-config-client"
git push origin master
③、新建module cloud-config-client-3355
④、POM
<dependencies>
<!-- SpringCloud Config客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</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-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
⑤、bootstrap.yml
spring:
cloud:
config:
name: cloud-config-client #需要從gitee上讀取的資源名稱,注意沒有yml後綴名
profile: dev #本次訪問的配置項
label: master
uri: http://config3344.com:3344 #本微服務啓動後先去找3344號服務,通過SpringCloudConfig獲取Gitee的服務地址
⑥、application.yml
spring:
application:
name: cloud-config-client
⑦、修改hosts文件
127.0.0.1 configClient3355.com
⑧、新建controller,驗證client端能否通過config server從gitee上讀取配置
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigClientRest {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServers;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
public String getConfig()
{
String str = "applicationName: "+applicationName+"\t eurekaServers:"+eurekaServers+"\t port: "+port;
System.out.println("******str: "+ str);
return "applicationName: "+applicationName+"\t eurekaServers:"+eurekaServers+"\t port: "+port;
}
}
⑨、主啓動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigClient_3355_App
{
public static void main(String[] args)
{
SpringApplication.run(ConfigClient_3355_App.class,args);
}
}
⑩、測試
啓動config配置中心3344微服務 並自測http://config3344.com:3344/application-dev.yml
啓動config客戶端3355 並自測:
如果profile:dev http://configClient3355.com:8201/config
如果profile:test http://configClient3355.com:8202/config
BOOTSTRAP.YML是什麼
applicaiton.yml是用戶級的資源配置項
bootstrap.yml是系統級的,優先級更加高
Spring Cloud會創建一個`Bootstrap Context`,作爲Spring應用的`Application Context`的父上下文。初始化的時候,`Bootstrap Context`負責從外部源加載配置屬性並解析配置。這兩個上下文共享一個從外部獲取的`Environment`。`Bootstrap`屬性有高優先級,默認情況下,它們不會被本地配置覆蓋。 `Bootstrap context`和`Application Context`有着不同的約定,
所以新增了一個`bootstrap.yml`文件,保證`Bootstrap Context`和`Application Context`配置的分離。