注:一些內容是個人見解喻旷,如有不準確的歡迎指正~
一,基本概念
SpringCloud定義
Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理牢屋,服務發(fā)現掰邢,斷路器,智能路由伟阔,微代理辣之,控制總線)。分布式系統的協調導致了樣板模式, 使用Spring Cloud開發(fā)人員可以快速地支持實現這些模式的服務和應用程序皱炉。他們將在任何分布式環(huán)境中運行良好怀估,包括開發(fā)人員自己的筆記本電腦,裸機數據中心,以及Cloud Foundry等托管平臺多搀。
特性
Spring Cloud專注于提供良好的開箱即用經驗的典型用例和可擴展性機制覆蓋歧蕉。
- 分布式/版本化配置
- 服務注冊和發(fā)現
- 路由
- service - to - service調用
- 負載均衡
- 斷路器
- 分布式消息傳遞
Eureka的基礎架構
Eureka的基礎架構:
服務提供
服務消費者
二,簡單模塊(配合代碼Demo演示)
eureka server
一康铭、服務發(fā)現組件我們?yōu)槭裁催x擇Eureka惯退?
1.Eureka來自生產環(huán)境,這是它天生的優(yōu)勢
2.Spring Cloud對Eureka支持很好
二从藤、Eureka簡介
Eureka是Netflix開發(fā)的服務發(fā)現框架催跪,本身是一個基于REST的服務,主要用于定位運行在AS域中的中間層服務夷野,以達到負載均衡和中間層服務故障轉移的目的懊蒸。
SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現Spring Cloud的服務發(fā)現功能悯搔。
Eureka項目相當活躍骑丸,代碼更新相當頻繁,目前最新版本是1.9.*
2.0的版本也正在緊鑼密鼓的開發(fā)中妒貌,2.0將會帶來更好的擴展性通危,并且使用細粒度的訂閱模型取代了基于拉取的模型。
注:(Eureka 2.0 開源工作宣告停止灌曙,繼續(xù)使用風險自負) 尷尬~
三黄鳍、Eureka Server 本身也支持集群。(跨區(qū)域等)
四 平匈、代碼實例
1.maven配置
<!-- springBoot的jar -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>
<!-- eureka-server -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- springCloud的基礎jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.啟動方法
@EnableEurekaServer //啟動一個服務注冊中心提供給其他應用進行對話
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3.配置參數
#服務名稱
spring.application.name=eureka-server
#端口號
server.port=1001
#設為false框沟,關閉自我保護主要(默認是關閉的)
eureka.server.enable-self-preservationz = true
#清理間隔(單位毫秒,默認是60*1000)
eureka.server.eviction-interval-timer-in-ms = 60000
eureka.instance.hostname=localhost
#是否向服務注冊中心注冊自己
# (在默認配置下增炭,Eureka Server會將自己也作為客戶端來嘗試注冊自己忍燥,我們需要禁用它的客戶端禁用行為)
eureka.client.register-with-eureka=false
#是否檢索服務
eureka.client.fetch-registry=false
#服務注冊中心的配置內容,指定服務注冊中心的位置 高可用的注冊(不同地域隙姿,啟動不同的eureka池)
# eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
4.啟動流程
@EnableEurekaServer包含了所有的Eureka Server啟動配置梅垄。
但是在EnableEurekaServer的注解聲明中,沒有看到任何初始化bean定義:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EurekaServerMarkerConfiguration.class)
public @interface EnableEurekaServer {
}
@Configuration
public class EurekaServerMarkerConfiguration {
@Bean
public Marker eurekaServerMarkerBean() {
return new Marker();
}
class Marker {
}
}
但是在EurekaServerMarkerConfiguration的配置中输玷,定義了一個空的類并進行了實例化队丝。按照這個類的探索,發(fā)現其實以上都是一個開關欲鹏,真正的配置都在EurekaServerAutoConfiguration中實現机久。
@Configuration
@Import(EurekaServerInitializerConfiguration.class)
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
@EnableConfigurationProperties({ EurekaDashboardProperties.class,
InstanceRegistryProperties.class })
@PropertySource("classpath:/eureka/server.properties")
public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter {
}
@Configuration
@EnableConfigurationProperties
@ConditionalOnClass(EurekaClientConfig.class)
@Import(DiscoveryClientOptionalArgsConfiguration.class)
@ConditionalOnBean(EurekaDiscoveryClientConfiguration.Marker.class)
@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)
@AutoConfigureBefore({ NoopDiscoveryClientAutoConfiguration.class,
CommonsClientAutoConfiguration.class, ServiceRegistryAutoConfiguration.class })
@AutoConfigureAfter(name = {"org.springframework.cloud.autoconfigure.RefreshAutoConfiguration",
"org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration",
"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration"})
public class EurekaClientAutoConfiguration {
}
總結來說,過程是:配置@EnableEurekaServer-@Import-》EurekaServerMarkerConfiguration-創(chuàng)建Marker實例-》掃描到EurekaServerAutoConfiguration時赔嚎,@ConditionalOnBean滿足加載條件膘盖,進行加載胧弛。
Eureka的啟動接口為com.netflix.eureka.EurekaBootStrap。EurekaBootStrap實現了javax.servlet.ServletContextListener侠畔,并在contextInitialized函數中初始化Eureka的參數和服務啟動结缚。
/**
* Initializes Eureka, including syncing up with other Eureka peers and publishing the registry.
*
* @see
* javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent event) {
try {
initEurekaEnvironment();//配置信息
initEurekaServerContext();//服務啟動
ServletContext sc = event.getServletContext();
sc.setAttribute(EurekaServerContext.class.getName(), serverContext);
} catch (Throwable e) {
logger.error("Cannot bootstrap eureka server :", e);
throw new RuntimeException("Cannot bootstrap eureka server :", e);
}
}
Eureka client
微服務中的每一個小的應用(模塊);我們創(chuàng)建提供服務的客戶端,并向服務注冊中心注冊自己
首先软棺,創(chuàng)建一個基本的Spring Boot應用红竭。命名為eureka-client
在pom.xml中,加入如下配置:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
main啟動配置
@EnableDiscoveryClient //注解用來將當前應用加入到服務治理體系中喘落。
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
//java spi test
/*ServiceLoader<Log> serviceLoader = ServiceLoader.load(Log.class);
Iterator<Log> iterator = serviceLoader.iterator();
while (iterator.hasNext()) {
Log log = iterator.next();
log.execute("iiiiiiiiiiii");
}*/
}
}
application.properties 參數配置
spring.application.name=eureka-client
server.port=2001
#指定服務注冊中心地址茵宪,類型為 HashMap,并設置有一組默認值揖盘,默認的Key為 defaultZone眉厨;默認的Value為 http://localhost:8761/eureka 锌奴,如果服務注冊中心為高可用集群時兽狭,多個注冊中心地址以逗號分隔。
#如果服務注冊中心加入了安全驗證鹿蜀,這里配置的地址格式為: http://<username>:<password>@localhost:8761/eureka 其中 <username> 為安全校驗的用戶名箕慧;<password> 為該用戶的密碼
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
ps:后面啟動的服務都與這個類似,只是使用不同的功能就添加不同的pom引入
服務消費者(基礎)
服務之間通過接口調用獲取數據
(見代碼展示)
服務消費者(Ribbon)
定義:
- Spring Cloud Ribbon是基于Netflix Ribbon實現的一套客戶端負載均衡的工具茴恰。它是一個基于HTTP和TCP的客戶端負載均衡器颠焦。它可以通過在客戶端中配置ribbonServerList來設置服務端列表去輪詢訪問以達到均衡負載的作用。
- 當Ribbon與Eureka聯合使用時往枣,ribbonServerList會被DiscoveryEnabledNIWSServerList重寫伐庭,擴展成從Eureka注冊中心中獲取服務實例列表。同時它也會用NIWSDiscoveryPing來取代IPing分冈,它將職責委托給Eureka來確定服務端是否已經啟動圾另。
- 而當Ribbon與Consul聯合使用時,ribbonServerList會被ConsulServerList來擴展成從Consul獲取服務實例列表雕沉。同時由ConsulPing來作為IPing接口的實現集乔。
- 我們在使用Spring Cloud Ribbon的時候,不論是與Eureka還是Consul結合坡椒,都會在引入Spring Cloud Eureka或Spring Cloud Consul依賴的時候通過自動化配置來加載上述所說的配置內容扰路,所以我們可以快速在Spring Cloud中實現服務間調用的負載均衡。
使用的通訊協議:
通信協議是HTTP或者HTTPS
使用方式
為RestTemplate增加@LoadBalanced注解
相關實例--
Spring Cloud Feign
Feign 簡介
在Spring Cloud Netflix棧中倔叼,各個微服務都是以HTTP接口的形式暴露自身服務的汗唱,因此在調用遠程服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection丈攒、Apache的Http Client渡嚣、Netty的異步HTTP Client, Spring的RestTemplate。但是,用起來最方便识椰、最優(yōu)雅的還是要屬Feign了绝葡。
定義:
- Feign是一種聲明式、模板化的HTTP客戶端腹鹉。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠程服務時能與調用本地方法一樣的編碼體驗藏畅,開發(fā)者完全感知不到這是遠程方法,更感知不到這是個HTTP請求功咒。
- 它使得編寫Web服務客戶端變得更加簡單愉阎。我們只需要通過創(chuàng)建接口并用注解來配置它既可完成對Web服務接口的綁定。它具備可插拔的注解支持力奋,包括Feign注解榜旦、JAX-RS注解。它也支持可插拔的編碼器和解碼器景殷。
- Spring Cloud Feign還擴展了對Spring MVC注解的支持溅呢,同時還整合了Ribbon和Eureka來提供均衡負載的HTTP客戶端實現
- 可以傳輸文件
比如:
/**
* @ProjectName springcloudroot
* @PackageName com.example.consumer.Controller
* @Author tanjianglong
* @CreatedTime 2017/8/22.
* @Description : eureka-consumer-feign demo
* 修改記錄:
* 1:直接調用 http
* 2:提供熔斷 降級服務
*/
@RestController
public class DcController {
@Autowired
private DcClient dcClient; //調用服務接口
@GetMapping("/consumer")
public String dc() {
return dcClient.consumer();
}
}
DcClient 代碼
@FeignClient(value = "eureka-client",fallback = DcClientImpl.class )
public interface DcClient {
@GetMapping("/dc")
public String consumer();
}
- A: @FeignClient用于通知Feign組件對該接口進行代理(不需要編寫接口實現),使用者可直接通過@Autowired注入。
- B: @RequestMapping表示在調用該方法時需要向/dc發(fā)送GET請求。
開發(fā)者通過dcClient.consumer()就能完成發(fā)送HTTP請求和解碼HTTP返回結果并封裝成對象的過程没讲。
通訊協議:
- Feign在默認情況下使用的是JDK原生的URLConnection發(fā)送HTTP請求,沒有連接池铣墨,但是對每個地址會保持一個長連接,即利用HTTP的persistence connection 办绝。我們可以用Apache的HTTP Client替換Feign原始的http client, 從而獲取連接池伊约、超時時間等與性能息息相關的控制能力。Spring Cloud從Brixtion.SR5版本開始支持這種替換孕蝉,首先在項目中聲明Apache HTTP Client和feign-httpclient依賴:
<!-- 使用Apache HttpClient替換Feign原生httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>${feign-httpclient}</version>
</dependency>
與dubbo的通訊協議區(qū)別-
服務容錯保護(Hystrix服務降級 && 斷路由)
熔斷器
定義
熔斷器屡律,容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節(jié)點,從而對延遲和故障提供更強大的容錯能力昔驱。
熔斷器的作用就是即時發(fā)現運行異常的服務疹尾, 告知調用者不再調用該服務接口, 從而避免調用者服務資源消耗殆盡骤肛。 原理如官網插圖:
配置使用
SpringCloud框架內微服務間交互使用Rest或Feign:
maven依賴
<!-- 服務降級纳本,斷路由相關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
restTemplate 中使用方式
/**
* @author 0217319
* @version V1.0
* @Description: 調用接口類
* @date 2018.8.22
*/
@Service
public class ConsumerService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback")//服務異常后執(zhí)行的方法
public String consumer() {
return restTemplate.getForObject("http://eureka-client/dc", String.class);
}
public String fallback() {
return "fallback is execute";
}
}
Feign + Hystrix 使用方式:
OpenFeign是自帶斷路器的, 不用在pom.xml和入口類添加新增引用腋颠, 但hytrix默認是關閉的繁成, 需要在配置文件中加入這個即可
feign.hystrix.enabled=true。
代碼使用(首先會調用 eureka-client 服務的 /DC接口 如果發(fā)生短融 淑玫,則會調用 DcClientImpl 類的consumer方法)
@FeignClient(value = "eureka-client",fallback = DcClientImpl.class )
public interface DcClient {
@GetMapping("/dc")
String consumer();
}
public class DcClientImpl implements DcClient {
@Override
public String consumer() {
return "error -----";
}
}
依賴隔離
定義
Hystrix則使用該模式實現線程池的隔離巾腕,它會為每一個Hystrix命令創(chuàng)建一個獨立的線程池面睛,這樣就算某個在Hystrix命令包裝下的依賴服務出現延遲過高的情況,也只是對該依賴服務的調用產生影響尊搬,而不會拖慢其他的服務叁鉴。
- 通過對依賴服務的線程池隔離實現,可以帶來如下優(yōu)勢:
- 應用自身得到完全的保護佛寿,不會受不可控的依賴服務影響幌墓。即便給依賴服務分配的線程池被填滿,也不會影響應用自身的額其余部分冀泻。
- 可以有效的降低接入新服務的風險常侣。如果新服務接入后運行不穩(wěn)定或存在問題,完全不會影響到應用其他的請求弹渔。
- 當依賴的服務從失效恢復正常后胳施,它的線程池會被清理并且能夠馬上恢復健康的服務,相比之下容器級別的清理恢復速度要慢得多肢专。
- 當依賴的服務出現配置錯誤的時候舞肆,線程池會快速的反應出此問題(通過失敗次數、延遲鸟召、超時胆绊、拒絕等指標的增加情況)氨鹏。同時欧募,我們可以在不影響應用功能的情況下通過實時的動態(tài)屬性刷新(后續(xù)會通過Spring Cloud Config與Spring Cloud Bus的聯合使用來介紹)來處理它。
- 當依賴的服務因實現機制調整等原因造成其性能出現很大變化的時候仆抵,此時線程池的監(jiān)控指標信息會反映出這樣的變化跟继。同時,我們也可以通過實時動態(tài)刷新自身應用對依賴服務的閾值進行調整以適應依賴方的改變镣丑。
- 除了上面通過線程池隔離服務發(fā)揮的優(yōu)點之外舔糖,每個專有線程池都提供了內置的并發(fā)實現,可以利用它為同步的依賴服務構建異步的訪問莺匠。
斷路由
定義
“斷路器”本身是一種開關裝置金吗,用于在電路上保護線路過載,當線路中有電器發(fā)生短路時趣竣,“斷路器”能夠及時的切斷故障電路摇庙,防止發(fā)生過載、發(fā)熱遥缕、甚至起火等嚴重后果卫袒。
在分布式架構中,斷路器模式的作用也是類似的单匣,當某個服務單元發(fā)生故障(類似用電器發(fā)生短路)之后夕凝,通過斷路器的故障監(jiān)控(類似熔斷保險絲)宝穗,直接切斷原來的主邏輯調用。但是码秉,在Hystrix中的斷路器除了切斷主邏輯的功能之外逮矛,還有更復雜的邏輯。還有自我修復功能`
熔斷器
- 服務的健康狀況 = 請求失敗數 / 請求總數. 熔斷器開關由關閉到打開的狀態(tài)轉換是通過當前服務健康狀況和設定閾值比較決定的.
- 當熔斷器開關關閉時, 請求被允許通過熔斷器. 如果當前健康狀況高于設定閾值, 開關繼續(xù)保持關閉. 如果當前健康狀況低于設定閾值, 開關則切換為打開狀態(tài).
- 當熔斷器開關打開時, 請求被禁止通過.
- 當熔斷器開關處于打開狀態(tài), 經過一段時間后, 熔斷器會自動進入半開狀態(tài), 這時熔斷器只允許一個請求通過. 當該請求調用成功時, 熔斷器恢復到關閉狀態(tài). 若該請求失敗, 熔斷器繼續(xù)保持打開狀態(tài), 接下來的請求被禁止通過.
- 熔斷器的開關能保證服務調用者在調用異常服務時, 快速返回結果, 避免大量的同步等待. 并且熔斷器能在一段時間后繼續(xù)偵測請求執(zhí)行結果, 提供恢復服務調用的可能.
Hystrix的內部處理邏輯
- 構建Hystrix的Command對象, 調用執(zhí)行方法.
- Hystrix檢查當前服務的熔斷器開關是否開啟, 若開啟, 則執(zhí)行降級服務getFallback方法.
- 若熔斷器開關關閉, 則Hystrix檢查當前服務的線程池是否能接收新的請求, 若超過線程池已滿, 則執(zhí)行降級服務getFallback方法.
- 若線程池接受請求, 則Hystrix開始執(zhí)行服務調用具體邏輯run方法.
- 若服務執(zhí)行失敗, 則執(zhí)行降級服務getFallback方法, 并將執(zhí)行結果上報Metrics更新服務健康狀況.
熔斷器DEMO-代碼
Hystrix監(jiān)控面板
定義
斷路器是根據一段時間窗內的請求情況來判斷并操作斷路器的打開和關閉狀態(tài)的转砖。而這些請求情況的指標信息都是HystrixCommand和HystrixObservableCommand實例在執(zhí)行過程中記錄的重要度量信息橱鹏,它們除了Hystrix斷路器實現中使用之外,對于系統運維也有非常大的幫助堪藐。這些指標信息會以“滾動時間窗”與“桶”結合的方式進行匯總莉兰,并在內存中駐留一段時間,以供內部或外部進行查詢使用礁竞,Hystrix Dashboard就是這些指標內容的消費者之一糖荒。
使用
maven依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
代碼啟動
為應用主類加上@EnableHystrixDashboard,啟用Hystrix Dashboard功能模捂。
效果--啟動查看
http://localhost:3100/hystrix.stream
三捶朵,SpringCloud 和 Dubbo 對比
通訊協議
- Dubbo支持dubbo、rmi狂男、hessian综看、http、webservice岖食、thrift红碑、redis等多種協議,但是Dubbo官網是推薦我們使用Dubbo協議的泡垃。
缺省協議析珊,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。
連接個數:單連接
連接方式:長連接
傳輸協議:TCP
傳輸方式:NIO異步傳輸
序列化:Hessian二進制序列化
適用范圍:傳入傳出參數數據包較忻镅ā(建議小于100K)忠寻,消費者比提供者個數多,單一消費者無法壓滿提供者存和,盡量不要用dubbo協議傳輸大文件或超大字符串奕剃。
適用場景:常規(guī)遠程服務方法調用
其他鏈接(http,webservice,rmi協議,hessian協議)
連接個數:多連接
連接方式:短連接
傳輸協議:TCP || HTTP
傳輸方式:同步傳輸
序列化:***
不支持文件傳輸
- SpringCloud 默認 使用http json傳輸
Spring Cloud也并不是和http+JSON強制綁定的,如有必要Thrift捐腿、protobuf等高效的RPC纵朋、序列化協議同樣可以作為替代方案
差異:
dubbo由于是二進制的傳輸,占用帶寬會更少
springCloud是http協議傳輸叙量,帶寬會比較多倡蝙,同時使用http協議一般會使用JSON報文,消耗會更大
dubbo大多數情況下都是使用長連接小數據量的模式提供服務使用的绞佩。所以寺鸥,對于類似于電商等同步調用場景多并且能支撐搭建Dubbo 這套比較復雜環(huán)境的成本的產品而言猪钮,Dubbo 確實是一個可以考慮的選擇。但如果產品業(yè)務中由于后臺業(yè)務邏輯復雜胆建、時間長而導致異步邏輯比較多的話烤低,可能Dubbo 并不合適。
平臺架構
- dubbo框架只是專注于服務之間的治理笆载,如果我們需要使用配置中心扑馁、分布式跟蹤這些內容都需要自己去集成,這樣無形中使用dubbo的難度就會增加凉驻。
- Spring Cloud幾乎考慮了服務治理的方方面面腻要,更有Spring Boot這個大將的支持,開發(fā)起來非常的便利和簡單涝登。
社區(qū)維護性:
- Dubbo雄家,是阿里巴巴服務化治理的核心框架,并被廣泛應用于中國各互聯網公司.但是沒有專門的團隊在維護更新了胀滚,需要使用者自己就必須要組建一個維護團隊趟济,先不論你要準備要集成多少功能做多少改造。包括自己想集成的東西咽笼,和現有版本的坑~
- Spring Cloud是大名鼎鼎的Spring家族的產品顷编。Spring專注于企業(yè)級開源框架的研發(fā),不論是在中國還是在世界上使用都非常廣泛.自從發(fā)展到現在剑刑,仍然在不斷的高速發(fā)展,版本和功能將會更加完善媳纬,我們可以重持續(xù)升級的版本中獲益~
四,總結
尋址服務
前端使用服務名而非ip地址調用接口
SpringCloud 帶來的不便和方便
開發(fā)成本叛甫,業(yè)務劃分层宫,
監(jiān)控服務
SQL慢查詢杨伙,節(jié)點機內存其监,Cpu使用情況,線程數限匣,接口響應時間統計
QBS
部分接口做單位時間內最大訪問數限制
五抖苦,參考資料
個人覺得比較好的基礎教程: