SpringCloud?微服務(wù)框架詳解
單體架構(gòu):將業(yè)務(wù)全部功能集中到一個項目中,打成一個war包存儲,部署在一臺服務(wù)器中,只有一個數(shù)據(jù)庫
優(yōu)點 :架構(gòu)簡單,部署成本低。適合小型項目
問題:高并發(fā)性能問題,開發(fā)時代碼耦合問題,部署升級時停服的問題
垂直架構(gòu):拆分模塊,每個模塊使用自己的數(shù)據(jù)庫,如果有模塊需要其他模塊數(shù)據(jù)時需要自己查對方模塊數(shù)據(jù)庫
問題:大量代碼冗余,系統(tǒng)難以維護(hù),性能問題,部署問題
分布式架構(gòu):根據(jù)業(yè)務(wù)功能對系統(tǒng)做拆分,每個業(yè)務(wù)功能作為獨(dú)立項目開發(fā),稱為一個服務(wù)
服務(wù)之間相互調(diào)用,分布式多節(jié)點部署
優(yōu)點:降低耦合,有利于服務(wù)升級和拓展 適合大型互聯(lián)網(wǎng)項目
缺點:服務(wù)調(diào)用關(guān)系錯綜復(fù)雜
在進(jìn)行服務(wù)拆分的時候要考慮很多問題:服務(wù)拆分的粒度如何界定,服務(wù)之后如何調(diào)用,服務(wù)的調(diào)用關(guān)系如何管理,需要指定一套有效的標(biāo)準(zhǔn)來約束分布架構(gòu)

微服務(wù)
架構(gòu)特點:1.單一職責(zé),每一個服務(wù)對應(yīng)唯一的業(yè)務(wù)能力,做到單一職責(zé)
2.自治,團(tuán)隊獨(dú)立,技術(shù)獨(dú)立,數(shù)據(jù)獨(dú)立,獨(dú)立部署和交付
3.面向服務(wù),服務(wù)提供統(tǒng)一的接口,與語言技術(shù)無關(guān)
4.隔離性強(qiáng),服務(wù)調(diào)用做好隔離,容錯,降級避免出現(xiàn)級聯(lián)問題(級聯(lián)故障是由于正反饋循環(huán)并且隨著時間的增加所產(chǎn)生的故障。典型表現(xiàn):最初由單個節(jié)點或子系統(tǒng)故障觸發(fā)的連鎖反應(yīng))
微服務(wù)的上述特點給分布式架構(gòu)制定啦一個標(biāo)準(zhǔn),進(jìn)一步降低服務(wù)之間的耦合,提供服務(wù)的獨(dú)立性和靈活性。微服務(wù)是一種經(jīng)過良好架構(gòu)設(shè)計的分布式架構(gòu)方案
微服務(wù)技術(shù)的對比

SpringCloud微服務(wù)框架
官網(wǎng)地址:Spring Cloud
開發(fā)springcloud組件的組織:spring社區(qū),alibaba,netflix
springCloud集成了各種微服務(wù)功能組件,基于SpringBoot實現(xiàn)組件的自動裝配
常見的組件:服務(wù)注冊發(fā)現(xiàn)(Eureka,nacos,consul),服務(wù)遠(yuǎn)程調(diào)用(OpenFeign,Dubbo),服務(wù)鏈路監(jiān)控(Zipkin,Sleuth),統(tǒng)一配置管理(SpringCloudConfig,nacos),統(tǒng)一網(wǎng)關(guān)路由(SpringCloudGateway,zuul),流控降級保護(hù)(Hystix,Sentinel)
SpringCloud底層是依賴于SpringBoot的,并且有版本兼容關(guān)系

服務(wù)拆分原則:1.不同微服務(wù)不用重復(fù)開發(fā)相同業(yè)務(wù)
2.微服務(wù)數(shù)據(jù)獨(dú)立,有自己的數(shù)據(jù)庫
3.微服務(wù)可以將自己的業(yè)務(wù)暴露為接口,供其他微服務(wù)使用
遠(yuǎn)程調(diào)用
微服務(wù)的調(diào)用方式:基于RestTemplate發(fā)起的http請求實現(xiàn)遠(yuǎn)程調(diào)用,http請求做遠(yuǎn)程調(diào)用只要知道ip,端口,接口路徑,請求參數(shù)即可。
步驟:1.注冊RestTemplate的實例到Spring容器
2.修改消費(fèi)者order-service服務(wù)中的OrderService類中的queryOrderById方法,根據(jù)Order對象中的userId查詢User
3.將查詢到的User填到Order對象
#在order-service服務(wù)中的OrderApplication啟動類中,注冊RestTemplate實例
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}#修改order-service服務(wù)中的OrderService類中的queryOrderById方法
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查詢訂單
Order order = orderMapper.findById(orderId);
//2查詢用戶
String url="http://userservice/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3封裝user信息
order.setUser(user);
// 4.返回
return order;
}
}在服務(wù)調(diào)用關(guān)系中,會有兩個不同的角色,這兩個角色是相對的
服務(wù)提供者Provider:一次業(yè)務(wù)中,被其他微服務(wù)調(diào)用的服務(wù),提供接口給其他服務(wù)
服務(wù)消費(fèi)者consumer:一次業(yè)務(wù)中,調(diào)用其他微服務(wù)的服務(wù),調(diào)用其他微服務(wù)提供的接口
注冊中心
解決問題:服務(wù)注冊與發(fā)現(xiàn)(服務(wù)治理問題)
Eureka注冊中心
EurekaServer:服務(wù)端,注冊中心
EurekaClient:客戶端

服務(wù)注冊:提供者啟動之后將自己的信息注冊到eureka-server(Eureka服務(wù)端)
eureka-server保存服務(wù)名稱到服務(wù)實例地址列表的映射關(guān)系
服務(wù)拉?。合M(fèi)者根據(jù)服務(wù)名稱拉取實例地址列表(注冊表)并緩存到本地
消費(fèi)者根據(jù)負(fù)載均衡算法選中一個實例地址,發(fā)起遠(yuǎn)程調(diào)用
健康檢查:提供者每隔一段時間(默認(rèn)30秒)向eureka-server發(fā)起請求,報告自己狀態(tài)。稱為心跳
當(dāng)超過一段時間(90秒)沒有發(fā)送心跳,eureka-server認(rèn)為微服務(wù)實例故障,將該實例從列表中剔除,拉取服務(wù)時,該故障實例排除
搭建eureka-server
1.引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>2.編寫啟動類
@SpringBootApplication
@EnableEurekaServer //開啟eureka的注冊中心功能
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3.編寫配置文件application.yml
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka啟動成功

服務(wù)注冊
引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>配置文件
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka可以將user-service多次啟動,模擬多實例部署,注意修改端口設(shè)置-Dserver.port=自定義的端口號

如果沒有service選項【IDEA】idea打開新項目,左下角的工作欄中沒有顯示Services解決辦法
在order-service完成服務(wù)拉取,修改OrderService的代碼,修改訪問路徑

在order-service項目的啟動類OrderApplication中RestTemplate添加負(fù)載均衡諸界
@Bean
@LoadBalanced //負(fù)載均衡注解
public RestTemplate restTemplate(){
return new RestTemplate();
}負(fù)載均衡
SpringCloud底層利用Ribbon的組件,實現(xiàn)負(fù)載均衡。服務(wù)調(diào)用者動態(tài)調(diào)用服務(wù)提供者的多個節(jié)點
Ribbon內(nèi)部就是集成了LoadBalancerClient負(fù)載均衡,通過@LoadBalance注解開啟負(fù)載均衡器。

基本流程:RibbonLoadBalanceClient從請求url中獲取服務(wù)名稱,DynamicServerListLoadBalancer根據(jù)服務(wù)名稱到eureka拉取服務(wù)列表eureka返回服務(wù)列表,IRule利用內(nèi)置的負(fù)載均衡規(guī)則從列表中選擇一個服務(wù),返回給RibbonLoadBalanceClient
Ribbon的負(fù)載均衡規(guī)則時一個叫IRule的接口來定義的,每一個接口就是一種規(guī)則
內(nèi)置的負(fù)載均衡規(guī)則:
RoundRobinRule 簡單的輪詢服務(wù)列表來選擇服務(wù)器,Ribbon默認(rèn)的負(fù)載均衡規(guī)則
ZoneAvoidanceRule 以區(qū)域可用的服務(wù)器為基礎(chǔ)進(jìn)行服務(wù)器的選擇
默認(rèn)的實現(xiàn)就是ZoneAvoidanceRule,是一種輪詢方案(一般使用默認(rèn)的負(fù)載均衡規(guī)則,不修改)
Ribbon采用默認(rèn)的懶加載,第一次訪問才會去創(chuàng)建LoadBalanceClient,請求時間會很長。
Nacos注冊中心
Nacos是阿里巴巴的產(chǎn)品,現(xiàn)在是SpringCloudAlibaba中的一個組件(SpringCloudAlibaba實現(xiàn)啦對SpringCloud組件進(jìn)行擴(kuò)展)

與Eureka的差異:依賴不同,服務(wù)地址不同
Nacos服務(wù)搭建,下載安裝包,解壓,在bin目錄下運(yùn)行startup.cmd -mstandalone
引入依賴,在父工程里面,引入
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>在服務(wù)消費(fèi)者和提供者的pom文件引入nacos的依賴,注釋掉eureka的依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>配置nacos地址,在user-service和order-service的application.yml中添加nacos地址,不要忘了注釋掉eureka的地址
spring:
cloud:
nacos:
server-addr: localhost:8848在啟動類添加注解@EnableDicoveryClient

Nacos服務(wù)分級存儲模型
一個服務(wù)有多個實例,實例分布在不同的機(jī)房中,Nacos將同一機(jī)房的實例劃分為一個集群
服務(wù)-集群-實例
服務(wù)調(diào)用盡可能選擇本地集群的服務(wù),跨集群調(diào)用延遲較高。(本地集群不可訪問時,在訪問其他集群)
給user-service配置集群,修改user-service的application.yml文件
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名稱復(fù)制一個user-service啟動配置,添加屬性
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
默認(rèn)的zoneAvoidanceRule不能實現(xiàn)同集群有效實現(xiàn)負(fù)載均衡,Nacos中提供了一個NacosRule的實現(xiàn),可以優(yōu)先從同集群中挑選實例。
修改負(fù)載均衡規(guī)則修改order-service的application.yml文件,修改負(fù)載均衡規(guī)則:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負(fù)載均衡規(guī)則 根據(jù)權(quán)重負(fù)載均衡:在實際部署中提高權(quán)重配置來控制訪問頻率,權(quán)重高訪問頻率高
在Nacos控制臺設(shè)置實例的權(quán)重值0~1之間
環(huán)境隔離namespace
Nacos中服務(wù)存儲和數(shù)據(jù)存儲的最外層都是一個namespace的東西,用做最外層隔離,修改order-service的application.yml文件:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空間,填I(lǐng)DNacos的服務(wù)實例分為兩種類型:
臨時實例:如果實例宕機(jī)超過一段時間,會從服務(wù)列表中剔除,默認(rèn)的類型
非臨時實例:如果實例宕機(jī),不會從服務(wù)列表中剔除,也叫永久實例
Nacos和Eureka的區(qū)別:
相同點:都支持服務(wù)注冊和服務(wù)拉取,都支持服務(wù)提供者心跳方式做健康檢測
區(qū)別:1.Nacos支持服務(wù)端主動檢測提供者狀態(tài):臨時實例采用心跳檢測,非臨時實例nacos主動詢問
2.臨時實例心跳不正常被剔除,非臨時實例則不會剔除
3.Nacos支持服務(wù)禮包變更的消息推送模式,服務(wù)列表更新更及時
4.Nacos集群默認(rèn)采用AP方式,集群中存在非實例時采用CP模式;Eureka采用AP模式
CAP定理:布魯爾定理
指出對于一個分布式計算機(jī)來說,不可能同時滿足三點,最多同時滿足兩點:
一致性(Consistency)系統(tǒng)中所有數(shù)據(jù)備份,在同一時刻同樣的值
可用性(Availability)保證每次請求不管成功失敗都有響應(yīng)
分區(qū)容錯性(Partition tolerance)系統(tǒng)中任意信息的丟失或失敗不會影響系統(tǒng)的繼續(xù)運(yùn)作
配置中心
配置統(tǒng)一管理和配置隔離問題
nacos=SpringCloud eureka注冊中心+SpringCloud config配置中心


項目的核心配置,需要熱更新的配置才有放到nacos管理的必要。基本不會變更的一些配置還是保存在微服務(wù)本地比較好。(熱加載:不重啟一個項目,使得部分代碼更新,通過java類加載器實現(xiàn))
保證項目中有bootstrap.yml
微服務(wù)要拉取nacos中管理的配置,并且與本地的application.yml配置合并,才能完成項目啟動
在bootstrap.yml中提那就配置中心相關(guān)內(nèi)容:環(huán)境相關(guān)spring.profiles.active
配置中心地址,配置文件后綴
配置加載順序:先加載共享配置文件,再加載環(huán)境相關(guān)配置文件,在加載application.yml

在idea中的使用
導(dǎo)入依賴
<!--nacos配置管理依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>添加bootstrap.yaml
spring:
application:
name: userservice # 服務(wù)名稱
profiles:
active: dev #開發(fā)環(huán)境,這里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后綴名配置熱更新
最終目的,是修改nacos中的配置后,微服務(wù)無需重啟就可以讓配置生效(配置熱更新)
使用兩種方式:
一:@Value注入的變量所在類上添加注解@RefreshScope:

二: 在controller中使用@ConfigurationProperties注解代替@Value注解。

到此這篇關(guān)于SpringCloud 微服務(wù)框架詳解的文章就介紹到這了,更多相關(guān)SpringCloud 微服務(wù)框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java微信公眾平臺開發(fā)(10) 微信自定義菜單的創(chuàng)建實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第十步,微信自定義菜單的創(chuàng)建實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Spring MVC數(shù)據(jù)處理和亂碼問題詳解
這篇文章主要給大家介紹了關(guān)于Spring MVC數(shù)據(jù)處理和亂碼問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
spring boot mybatis多數(shù)據(jù)源解決方案過程解析
這篇文章主要介紹了spring boot mybatis多數(shù)據(jù)源解決方案過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
Spring Boot實現(xiàn)通用的接口參數(shù)校驗
本文介紹基于 Spring Boot 和 JDK8 編寫一個 AOP ,結(jié)合自定義注解實現(xiàn)通用的接口參數(shù)校驗。具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
Java中構(gòu)造函數(shù),set/get方法和toString方法使用及注意說明
這篇文章主要介紹了Java中構(gòu)造函數(shù),set/get方法和toString方法的使用及注意說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Java后臺通過Collections獲取list集合中最大數(shù),最小數(shù)代碼
這篇文章主要介紹了Java后臺通過Collections獲取list集合中最大數(shù),最小數(shù)代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
SpringBoot集成FastDFS依賴實現(xiàn)文件上傳的示例
這篇文章主要介紹了SpringBoot集成FastDFS依賴實現(xiàn)文件上傳,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Java棧之鏈?zhǔn)綏4鎯Y(jié)構(gòu)的實現(xiàn)代碼
這篇文章主要介紹了Java棧之鏈?zhǔn)綏4鎯Y(jié)構(gòu)的實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04

