SpringCloud 學習筆記
SpringCloud
這個階段該如何學
三層架構
框架:
Spring IOC AOP
SpringBoot, 新一代的JavaEE開發標準,自動裝配
模塊化~ all in one
模塊化的開發
微服務架構4個核心問題?
1. 服務很多,客戶端該怎么訪問? api網關
2. 這么多服務? 服務之間如何通信? http,rpc
3. 這么多服務? 如何治理? 服務注冊與發現機制使用注冊中心zookeeper,Eureka
4. 服務掛了怎么辦? 水平拆分,垂直拆分,熔斷機制,服務降級,
解決方案:
Spring Cloud 生態!
1. Spring Cloud NetFlix 一站式解決方案!
api網關, zuul組件
Feugn, --HttpCLient-- http通信方式 同步阻塞
服務組測與發現: Eureka
熔斷機制: Hystrix
2. Apache Dubbo Zookeeper 半自動,需要整合別人的!
api網關: 沒有,找第三方組件或者自己實現
Dubbo RPC 異步不阻塞
Zookeeper
熔斷機制:沒有 借助第三方組件
3. Spring Cloud Alibaba 一站式解決方案! 更簡單
新概念: 服務網格~ Server Mesh
istio
萬變不離其宗
1. api
2. http ,rpc
3. 注冊和發現
4. 熔斷機制
帶著問題走進微服務
1.1 什么是微服務?
微服務架構風格是一種將單個應用程序作為一套小型服務開發的方法,每種應用程序都在自己的進程中運行,并與輕量級機制(通常是HTTP資源API)進行通信。
1.2 微服務之間如何進行通訊?
? 使用http或者rpc
1.3 SpringCloud和Dubbo有哪些區別?
Dubbo和Spring Cloud并不是完全的競爭關系,兩者所解決的問題域不一樣:Dubbo的定位始終是一款RPC框架,而Spring Cloud的目的是微服務架構下的一站式解決方案。
1.4 springBoot和SpringCloud,請談談對他們的理解
1、SpringBoot:是一個快速開發框架,通過用MAVEN依賴的繼承方式,幫助我們快速整合第三方常用框架,完全采用注解化(使用注解方式啟動SpringMVC),簡化XML配置,內置HTTP服務器(Tomcat,Jetty),最終以Java應用程序進行執行。
2、SpringCloud: 是一套目前完整的微服務框架,它是是一系列框架的有序集合。它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過SpringBoot風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用SpringBoot的開發風格做到一鍵啟動和部署。
1.5 什么是服務熔斷?什么是服務降級?
1.6微服務的優缺點分別是什么?說下你在項目開發中遇到的坑
1.7你所知道的微服務技術棧有哪些?請列舉一二
1.8eureka和zookeeper都可以提供服務注冊與發現的功能,請說說兩個的區別
2, 微服務概述
2.1 什么是微服務
**微服務架構: **把一個大型的單個應用程序和服務拆分為數個甚至數十個的支持微服務,它可擴展單個組件而不是整個的應用程序堆棧,從而滿足服務等級協議。
**微服務:**微服務是由單一應用程序構成的小服務,擁有自己的進程與輕量化處理,服務依業務功能設計,以全自動的方式部署,與其他服務使用 HTTP API 通訊。同時,服務會使用最小規模的集中管理 (例如 Docker)技術,服務可以用不同的編程語言與數據庫等。
微服務的優缺點:
優點
- 每個微服務都很小,這樣能聚焦一個指定的業務功能或業務需求。
- 微服務能夠被小團隊單獨開發,這個小團隊是2到5人的開發人員組成。
- 微服務是松耦合的,是有功能意義的服務,無論是在開發階段或部署階段都是獨立的。
- 微服務能使用不同的語言開發。
- 微服務易于被一個開發人員理解,修改和維護,這樣小團隊能夠更關注自己的工作成果。無需通過合作才能體現價值。
- 微服務允許你利用融合最新技術。
- 微服務只是業務邏輯的代碼,不會和HTML,CSS 或其他界面組件混合。
缺點
-
微服務架構可能帶來過多的操作。
-
需要DevOps技巧 (http://en.wikipedia.org/wiki/DevOps)。
-
可能雙倍的努力。
-
分布式系統可能復雜難以管理。
-
因為分布部署跟蹤問題難。
-
當服務數量增加,管理復雜性增加。
-
服務之間通信成本增加
-
數據一致性
-
性能監控
2.2 微服務技術棧有哪些?
微服務條目 | 落地技術 |
---|---|
服務開發 | SpringBoot,Spring,SpringMVC |
服務配置與管理 | Netfilx公司的Archaius,阿里的Diamond等 |
服務注冊與發現 | EureKa,Consul,zookeeper等 |
服務調用 | Rest,RPC,gRPC |
服務熔斷器 | Hystrix,Envoy等 |
負載均衡 | RIbbon,Nginx等 |
服務接口調用 | Feign等 |
消息隊列 | kafka,RabbitMQ,ActiveMQ等 |
服務配置中心管理 | SpringCloudConfig,Chef等 |
服務路由(API網關) | Zuul等 |
服務監控 | Zabbix,Nagios,Metrics,Specateator等 |
全鏈路追蹤 | Zipkin,Brave,Dapper等 |
服務部署 | Docker,OpenStack,Kubernetes等 |
數據流操作開發包 | SpringCloud Stream(封裝與Redis,Rabbit,Kafka等發送接受消息) |
事件消息總線 | SpringCloud Bus |
2.3 為什么選擇SpringCloud作為微服務架構
1.選型依據
- 整體解決方案和框架成熟度
- 社區熱度
- 可維護性
- 學習曲線
2. 當前各大IT公司用的微服務架構有哪些?
- 阿里: dubbo+HFS
- 京東: JSF
- 新浪: Motan
- 當當網: Dubbox
3. 各微服務框架對比
3. SpringCloud入門概述
3.1 springCloud是什么
SpringCloud,基于SpringBoot提供了一套微服務解決方案,包括服務注冊與發現,配置中心,全鏈路監控,服務網關,負載均衡,熔斷器等組件,除了基于NetFlix的開源組件做高度抽象封裝之外,還有一些選型中立的開源組件
SpringCloud利用SpringBoot的開發的便利性,巧妙地簡化了分布式系統基礎設施的開發,springCloud為開發人員提供了快速構建分布式系統的一些工具,包括配置管理,服務發現,斷路器,路由,微代理,事件總線,全局鎖,決策競選,分布式會話等等,他們都可以用SpringBoot的開發風格做到一鍵化部署
springCloud并沒有重復造輪子,他只是將目前各家公司開發的比較成熟,經得起實際考核的服務框架組合起來,通過SpringBoot風格進行再次封裝,屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂的,易部署,和易維護的分布式系統開發工具包
SpringCloud是分布式微服務架構下的一站式解決方案,是各個微服務架構落地技術的集合體,俗稱微服務全家桶
3.2 springCloud和SpringBoot關系
- SpringBoot專注于快速方便的開發單個個體微服務,
- SpringCloud是關注全局的微服務協調整理治理框架,他將SpringBoot開發的一個個單體服務整合并管理起來,為各個微服務之間提供: 配置管理,服務發現,斷路器,路由,微代理,事件總線,全局鎖,決策競選,分布式會話等等集成服務
- SpringBoot可以離開SpringCloud獨立使用,開發項目,但是SpringCloud離不開SpringBoot,屬于依賴關系
- SpringBoot專注于快速,方便的開發個體微服務,SpringCloud關注全局的服務治理框架
3.3 Dubbo和SpringCloud技術選型
1.分布式+服務治理Dubbo
應用服務話拆分+ 消息中間件
Dubbo和SpringCloud對比
最大區別: SpringCloud拋棄了Dubbo的RPC通信,采用的是基于HTTP的REST方式
SpringCloud如何實現通信(http通信)
使用restTemplate實現,該類springBoot只提供了實現,注入需要我們手動配置
<dependencyManagement>
<dependencies>
<!--版本控制中心,子工程如果導入下列jar,不需要輸入版本號-->
<!--springcloud的依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-release.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Dubbo+Zookeeper實現通信(RPC異步通信)
導入相關依賴,配置zookeeper地址,并將dubbo服務者和消費者注冊到zookeeper中,在需要提供服務的類上添加@service(dubbo提供的注解)和@service(將該類交由spring管理),在消費者上添加@@Reference注解注入此類型(需要在maven中導入服務者的坐標)
4.Eureka服務注冊與發現(和zookeeper對比)
4.1 什么是Eureka
- Eureka 遵從AP原則
- Eureka是NetFlix的一個子模塊,也是核心模塊之一,Eureka是一個基于REST的服務,用于定位服務,以實現云端中間層服務發現和故障轉移.服務注冊與發現對于微服務來說是非常重要的,有了服務注冊與發現,只需要使用云端的服務標識符,就可以使用云端服務,而不需要修改服務調用的配置文件了,功能類似于Dubbo的注冊中心,例如zookeeper
4.2 原理講解
-
Eureka基本架構
-
SPringCloud封裝了NetFlix公司開發的Eureka模塊來實現服務注冊與發現
-
采用C/S架構設計,EurekaServer作為服務注冊功能的服務器,它是服務注冊中心
-
系統中的其他微服務使用EurekaClient連接到EurekaServer并維持心跳連接(什么是心跳連接),這樣系統的為湖人員就可以通過EurekaServer監控系統的服務運行狀態,(如何監控采用Zuul等技術)
-
三大角色
- Eureka Server : 提供服務的注冊與發現
- Server Provider: 將自身服務注冊到Eureka中,從而使消費方能夠找到
- Server Consumer: 服務消費方從Eureka中獲取注冊服務列表,從而找到消費服務
如何使用
Eureka服務注冊端
導入依賴
<!--導入eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
配置eureka
server:
port: 7001
#Eureka配置
eureka:
instance:
hostname: localhost #eureka服務端的名字
client:
register-with-eureka: false # 表示是否向eureka注冊中心注冊自己
fetch-registry: false #如果為false,則表示自己為注冊中心
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
在啟動類上標注開啟注解
訪問7001端口
Eureka(服務提供者)
導入依賴
<!--導入eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
<classifier>sources</classifier>
<type>java-source</type>
</dependency>
<!--完善eureka監控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置client
#Eureka服務提供者配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: ${spring.application.name}
#監控配置
info: #其實就是一個map存放kv鍵值對當訪問/actuator/info時以json字符串返回
app.name: provider-springcloud
company.name: czp
message: eureka學習
開啟注解@enableeurekaclient
在controller中配置
//訪問這個頁面可以查看微服務的一些信息
@GetMapping("/dept/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
System.out.println("discovery=>services:" + services);
//得到一個具體的微服務信息,通過具體的微服務id,
List<ServiceInstance> provider = discoveryClient.getInstances("provider");
for (ServiceInstance serviceInstance : provider) {
System.out.println("----------------------------------------");
System.out.println("主機ip:" + serviceInstance.getHost());
System.out.println("主機端口" + serviceInstance.getPort());
System.out.println("url地址" + serviceInstance.getUri());
System.out.println("服務名稱" + serviceInstance.getServiceId());
}
return this.discoveryClient;
}
需要添加@EnableDiscoveryClient //開啟服務注冊發現注解
Eureka(服務消費者)
導入依賴
<!--導入eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
<classifier>sources</classifier>
<type>java-source</type>
</dependency>
對其進行配置
#eureka服務消費者配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
register-with-eureka: false # 不向eureka中注冊自己
將restTemplate中url的前綴該為服務提供者的id
private static final String REST_URL_PREFIX = "http://PROVIDER";
使用restTemplate對其進行訪問傳輸即可
Eureka集群
創建多個EurekaServer,在每個EurekaServer中配置
service-url:
#單個關注自己 http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: #多個關注其他EurekaServer地址
EurekaClient(服務注冊者在注冊時三個都要進行登記注冊)
訪問7001
服務注冊成功
自我保護機制
CAP原則Eureka對比Zookeeper
CAP原則
RDBMS (關系型數據庫) 遵從ACID原則
NoSQL(非關系型數據庫)遵從CAP原則
ACID原則是什么
- A(Atomicity) 原子性
- C(Consistency) 一致性
- I(Isolation)隔離性
- D(Durability)持久性
CAP是什么
- C (Consistency) 強一致性
- A(Availability) 可用性
- P(Partition tolerance)分區容錯性
CAP的三進二: CA,AP,CP
CAP理論的核心
-
一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求
-
根據CAP原理NoSQL數據庫分成了滿足CA原則,滿足CP原則和滿足AP原則三大類
-
CA:單點集群,滿足強一致性和可用性的系統,通常可擴展性較差
-
CP: 滿足一致性,分區容錯性的系統,通常性能不是特別高
-
AP: 滿足可用性和分區容錯性的系統,通常可能對一致性的要求低一些
-
作為服務注冊中心,Eureka比Zookeeper好在哪里?
著名的CAP理論指出,一個分布式系統不可能同時滿足C(一致性),A(可用性),P(容錯性)
由于分區容錯性P在分布式系統中是必須要保證的,因此我們只能在A和C之間進行權衡
- Zookeeper保證的是CP;
- Eureka保證的是AP;
Zookeeper保證的是CP
Eureka保證的是AP
5.ribbon負載均衡
ribbon是什么?
- Spring Cloud ribbon是基于NetFlix Ribbon實現的一套客戶端負載均衡的工具
- 簡單來說,Ribbon是NetFlix發布的開源項目,主要功能是提供客戶端的軟件均衡算法,將NetFlix的中間件服務連接在一起,Ribbon的客戶端組件提供一系列完整的配置項,如連接超時,重試等等,簡單的來說,就是在配置文件中列出LoadBalancer(簡稱LB: 負載均衡)后面所有的機器,RIbbon會自動地幫助你基于某種規則(簡單輪詢,隨即鏈接等等)去連接這些機器,我們也很容易使用Ribbon實現自定義的負載均衡算法!
ribbon能干嘛?
- LB, 負載均衡,在微服務或者是分布式集群中經常用的一種應用
- 負載均衡簡單的來說就是將用戶的請求平攤的分配到多個服務上,從而達到系統的HA(high a[CAP中的A 高可用])
- 常見的負載均衡軟件有Nginx,lVS等等
- dubbo,springcloud中軍給我們提供了負載均衡SpringCloud的負載均衡算法可以自定義
- 負載均衡簡單分類
- 集中式LB
- 即在服務的消費方和提供方之間使用獨立的LB(負載均衡)設施,如Nginx,由該設施負責將訪問請求通過某種策略轉發至服務的提供方
- 進程式LB
- 將LB邏輯集成到消費方,消費方從服務注冊中心獲知有哪些地址可用,然后自己再從這些地址中選出一個合適的服務器
- RIbbon就屬于進程內LB,他只是一個類庫,集成于消費方進程,消費方通過它來獲取到服務提供方的地址
- 集中式LB
如何使用ribbon
導入依賴
<!--導入ribbon 負載均衡中間件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
在restTemplate上添加@LoadBalanced //Ribbon即可(使用默認的輪播分發模式)
自定義Ribbon算法
將實現iRule的接口實現類注入
iRule算法策略
/**
* iRule
* AvailabilityFilteringRule : 會先過濾掉跳閘,無法訪問的服務;對剩下的進行輪詢
* RoundRobinRule: 輪詢
* RandomRule: 隨機
* RetryRule: 重試 會按照輪詢獲取服務~,
* 如果服務獲取失敗,則會在指定的時間內進行重試
* WeightedResponseTimeRule: 30秒計算一次服務器響應時間,
* 以響應時間作為權重,響應時間越短的服務器被選中的概率越大。
* ClientConfigEnabledRoundRobinRule內部定義了RoundRobinRule,
* choose方法還是采用了RoundRobinRule的choose方法,所以它的選擇策略和RoundRobinRule的選擇策略一致,
* PredicateBasedRule PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一個子類,
* 它先通過內部定義的一個過濾器過濾出一部分服務實例清單,
* 然后再采用線性輪詢的方式從過濾出來的結果中選取一個服務實例。
* ZoneAvoidanceRule ZoneAvoidanceRule中的過濾條件是以
* ZoneAvoidancePredicate為主過濾條件和以AvailabilityPredicate為
* 次過濾條件組成的一個叫做CompositePredicate的組合過濾條件,過濾成功之后,
* 繼續采用線性輪詢的方式從過濾結果中選擇一個出來。
* @return
*/
name: 指定要調用的服務
6.Feign負載均衡
6.1簡介
feign是聲明式的web service客戶端,它讓微服務之間的調用變得更簡單了,類似controller調用service,springcloud集成了Ribbon和Eureka,可在使用feign時提供負載均衡的http客戶端
只需要創建一個接口,然后添加注解即可
feign,主要是社區,大家都習慣面向接口編程,這個是很多開發人員的規范,調用微服務訪問兩種方法
- 微服務名字[ribbon]
- 接口和注解[feign]
feign能干什么?
feign集成了Ribbon
服務降級
在API層為service接口編寫一個服務訪問錯誤類(繼承FallbackFactory)
例如:
//接口類
//配置微服務的名字
@FeignClient(value = "PROVIDER", fallbackFactory = DeptClientServiceFallBackFactory.class)
public interface DeptService {
@PostMapping("/dept/add")
boolean addDept(Dept dept);
@GetMapping("/dept/get/{id}")
Dept queryById(@PathVariable("id") long deptno);
@GetMapping("/dept/list")
List<Dept> queryAll();
}
//服務訪問錯誤類
public class DeptClientServiceFallBackFactory implements FallbackFactory {
@Override
public DeptService create(Throwable throwable) {
return new DeptService() {
@Override
public boolean addDept(Dept dept) {
return false;
}
@Override
public Dept queryById(long deptno) {
return new Dept().setDeptno(-100).setDeptname("小王").setDb_source("沒有對應數據源");
}
@Override
public List<Dept> queryAll() {
return null;
}
};
}
}
在服務消費者的啟動類上添加@EnableFeignClients(“需要掃描的包(自己添加feign注解)”)
? 服務降級的作用,當我們發現某些服務注冊者使用的較少時,就可以將該服務實例先中斷,在啟動使用爆滿的服務分攤請求壓力,這時有其他請求訪問該節點時,就會將api提供好的錯誤返回,當需要啟用該節點時,服務將會正常返回請求
7.Hystrix 服務熔斷
在了解Hysrtix之前先了解什么是服務雪崩
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hfA0ZPJL-1588047664944)(C:\Users\車澤平\AppData\Roaming\Typora\typora-user-images\1587692118918.png)]
什么是Hysrix
能干嘛
- 服務降級
- 服務熔斷
- 服務限流
- 接近實時的監控
服務熔斷
是什么
如何使用
為需要對服務進行熔斷的方法編寫一個服務癱瘓的方法,導入依賴并添加相應注解即可
具體步驟
//導入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
@SpringBootApplication
@EnableEurekaClient //在服務啟動后自動注冊到Eureka中
@EnableDiscoveryClient //開啟服務注冊發現
@EnableCircuitBreaker //開啟Hystrix功能
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
//為queryById服務注冊編寫一個hystrix_QueryById服務熔斷調用方法
@GetMapping("/dept/get/{id}")
@HystrixCommand(fallbackMethod = "hystrix_QueryById")
public Dept queryById(@PathVariable("id") Long deptno) {
Dept dept = deptService.queryById(deptno);
int i = 1/0;
if (dept == null) {
throw new RuntimeException("該用戶不存在!");
}
return dept;
}
public Dept hystrix_QueryById(@PathVariable("id") Long deptno) {
return new Dept().setDeptno(-100)
.setDeptname("用戶不存在")
.setDb_source("該用戶不存在");
}
Dashboard流監控
如何使用
創建一個新的module用于啟動監控服務
導入依賴
<!--導入hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--導入監控信息-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
啟動之前的eureka集群,并在上述以配置好Hystrix的module中加入一個servlet
//增加一個servlet
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
servletRegistrationBean.addUrlMappings("/hystrix.stream");
return servletRegistrationBean;
}
啟動80端口訪問Hystrix注冊的服務(如果不訪問服務,直接訪問/hystrix.stream頁面將會一直ping)
在localhost:prot/hystrix頁面輸入需要監控的url和參數即可監控此節點
如何查看Dashboard流監控信息
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pYf0WqPE-1588047664963)(C:\Users\車澤平\AppData\Roaming\Typora\typora-user-images\1587981197150.png)]
8.Zuul路由網關
概述
什么是Zuul
? zuul包含了對請求的路由和過濾兩個最主要的功能:
? 其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎,而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗,服務聚合等功能的基礎,Zuul和Eureka進行整合,將Zuul自身注冊為Eureka服務治理下的應用,同時從Eureka中獲得其他微服務的消息,也即以后的訪問微服務都是通過Zuul跳轉后獲得的
? 注意: Zuul服務最終還是會注冊到Eureka
? 提供: 代理+ 路由+ 過濾三大功能!
能干嘛
- 路由
- 過濾
怎么用
重新創建一個module
導入依賴
<dependencies>
<!--導入Zuul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--導入hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--導入監控信息-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--導入eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
<classifier>sources</classifier>
<type>java-source</type>
</dependency>
<!--完善eureka監控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
編寫配置
server:
port: 9527
spring:
application:
name: springcloud-zuul-getway
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #需要監聽的服務注冊中心
instance:
instance-id: zuul-9527
prefer-ip-address: true #顯示服務IP地址
zuul:
routes:
mydept.serviceId: provider
mydept.path: /mydept/**
ignored-services:
provider # 如果設為"*" 則所有配置的映射都不能通過服務注冊的實例id訪問只有通過routes映射的path訪問
prefix: /czp #設置公共的訪問前綴
啟動服務之后就可以通過http://localhost:9527/(配置的訪問前綴如: czp)/(配置的映射路徑如: mydept)/(服務注冊的請求路徑)
9. SpringCloud config分布式配置
概述
分布式系統面臨的–配置文件的問題
? 微服務意味著要將單體應用中的業務拆分成一個個子服務,每個服務的粒度相對較小,因此系統中會出現大量的服務,由于每個服務都需要必要的配置信息才能運行,所以一套集中式的,動態的配置管理設施是必不可少的,SpringCloud提供了ConfigServer來解決這個問題,我們每一個微服務自己帶著一個application,那上百配置文件要修改起來,十分麻煩
? Spring Cloud Config 為微服務架構中微服務提供集中化的外部配置支持,配置服務器為各種不同微服務應用的所有環節提供了一個中心化的外部配置
? Spring Cloud Config 分為服務端和客戶端兩部分;
? 服務端也稱為分布式配置中心,它是一個獨立的微服務應用,用來連接配置服務器并為客戶端提供獲取配置信息,加密,解密等訪問接口。
? 客戶端則是通過指定的配置中心來管理應用資源,以及與業務相關的配置內容,并在啟動的時候從配置中心獲取和加載配置信息,配置服務器默認采用git來存儲配置信息,這樣有助于對環境配置進行版本管理,并且可以通過git客戶端工具來方便的管理和訪問配置內容
SpringCloud config分布式配置中心能干嘛?
- 集中管理配置文件
- 不同環境,不同配置,動態化的更新配置,分環境部署,比如 /dev /test /prod /beta /release
- 運行期間動態調整配置,不在需要在每個服務部署的機器上編寫配置文件,服務回想配置中心統一拉取配置自己的信息
- 當配置發生變動時,服務不需要重啟,即可感知到配置的變化,并應用新的配置
- 將配置信息以REST接口的形式暴露
SpringCloud config分布式配置中心與git整合
? 由于SpringCLoud Config默認采用Git來存儲配置文件(也支持SVN和本地文件),但是最推薦使用的還是Git,而且使用的是http/https訪問的形式
怎么用
-
在碼云上編寫好倉庫和配置文件(各個項目對應的application.yml)
-
編寫服務器讀取配置文件
導入依賴 <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
#編寫配置 server: port: 3344 spring: application: name: springcloud-config-name #連接遠程倉庫 cloud: config: server: git: uri: https://gitee.com/a_lazy_farmer/springcloud-config.git #倉庫對應的配置文件 http形式地址
在啟動類上添加@EnableConfigServer注解 //開啟配置服務
服務器編寫成功
-
客戶端編寫(需要進行配置的程序)
導入依賴 <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
新建bootstrap.yml #預讀取配置文件的配置信息
# 系統級別的配置
spring:
cloud:
config:
name: config-client #從git中讀取的資源名稱
uri: http://localhost:3344 #服務器地址
profile: dev #部署環境
label: master #倉庫分支
配置成功
總結
以后的提升道路
感謝秦老師的講解,此筆記為秦疆老師的SpringCloud筆記轉載以及自己的一些感悟,僅供學習使用
智能推薦
SpringCloud學習筆記
SpringCloud學習筆記 ESB企業服務總線:用來連接各個服務節點,為了集成各種不同的服務。 1.系統架構演變 目標: 了解項目架構的演變歷程。 小結: 集中式架構 垂直拆分 分布式架構 SOA面向服務架構 微服務架構 2.微服務架構說明 目標: 了解SOA與微服務架構的區別以及說出微服務架構的特點。 分析: &emsp...
SpringCloud學習筆記-Eureka
注冊中心-Eureka Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務注冊和發現。Eureka 采用了 C-S 的設計架構。Eureka Server 作為服務注冊功能的服務器,它是服務注冊中心。而系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server,并維持心跳連接。這樣系統的維護人員就可以通過 Eureka Server ...
SpringCloud學習筆記------Feign
feign有假裝的意思 為什么要叫假裝? Feign可以把Rest的請求進行隱藏,偽裝成類似SpringMVC的Controller一樣。你不用再自己拼接url,拼接參數等等操作,一切都交給Feign去做。 快速入門 先用起來,我們在使用的時候揭開它神秘的面紗吧 導入依賴 pom.xml 引入: Feign的客戶端 寫一個Controller dao層 啟...
SpringCloud學習筆記
介紹 Spring Cloud是一系列技術的有序整合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發。 Spring Boot擅長的是集成,把世界上最好的框架集成到自己項目中,Spring Cloud也是一樣,把非常流行的微服務的技術整合到一起。 Spring Cloud從架構層面上降低了對大型系統構建的要求和難度,使我們以非常低的成本(技術或者硬件)搭建一套高效、分...
SpringCloud 學習筆記
SpringCloud 學習筆記 文章目錄 SpringCloud 學習筆記 1 簡介 1.1 什么是 SpringCloud 1.2 SpringCloud 能干什么 2. 微服務 2.1 什么是微服務 2.2 微服務與微服務架構 2.3 微服務架構的四個核心問題 2.4 微服務優缺點 2.5 微服務技術棧有哪些? 2.6 為什么選擇 SpringCloud 作為微服務架構 1. 選型依據 2....
猜你喜歡
SpringCloud - Nacos學習筆記
Nacos學習筆記 nacos簡介 Nacos使用 Nacos Server安裝 Nacos啟動 Nacos關閉 單機模式支持mysql 集群部署 配置管理 客戶端使用方式 動態刷新 命名空間與分組 命名空間 分組 自定義擴展的 Data Id 配置 服務注冊發現 nacos簡介 Nacos 支持幾乎所有主流類型的“服務”的發現、配置和管理: Spring Cloud Du...
SpringCloud Gateway學習筆記
SpringCloud Gateway是Spring cloud的一個全新項目,是基于Spring5.0、Spring Boot 2.0和project Reactor等技術開發的網關,它旨在為微服務架構提供一個簡單有效的統一的API路由管理方式。 SrpingCloud Gateway作為spring cloud生態系統的網關,目標是替代Zuul,為了提升網關的性能,SpringCloud Ga...
springcloud 學習筆記
1. Eureka 注冊中心 Spring cloud 封裝了Netflix開發的Eureka來實現服務的注冊和發現 1.引入依賴 2.書寫配置文件 3.書寫啟動類 Eureka 注冊中心需要在啟動類上添加@@EnableEurekaServer 在服務提供者和消費者的啟動類上添加@EnableEurekaClient 同時在配置文件中添加上相關配置 4. 服務提供者和消費者配置 添加相關的mav...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...