成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

SpringCloud微服務(wù)實(shí)戰(zhàn)筆記

chunquedong / 3336人閱讀

摘要:服務(wù)提供者的運(yùn)行機(jī)制用了雙層結(jié)構(gòu)來(lái)維護(hù)注冊(cè)的服務(wù)信息,第一層為服務(wù)的名稱(chēng),第二層為服務(wù)的實(shí)例名稱(chēng)。服務(wù)注冊(cè)中心的運(yùn)行機(jī)制為了防止服務(wù)的異常下線(xiàn),會(huì)周期性的清理列表中未續(xù)約的服務(wù)。負(fù)載均衡器的基本功能維護(hù)該服務(wù)下的所有節(jié)點(diǎn)列表。

Spring Boot Spring Boot有什么作用

Spring Boot通過(guò)自動(dòng)化的配置簡(jiǎn)化Spring原有的樣板化的配置。

Spring Boot提供了很多現(xiàn)成的starter,可以快速的實(shí)現(xiàn)各種服務(wù)。

actuator

actuator用于監(jiān)控和管理服務(wù)信息。

服務(wù)治理:Eureka

有了,找到了!

Eureka的功能

Eureka的功能是提供服務(wù)的注冊(cè)和服務(wù)的發(fā)現(xiàn)。

實(shí)現(xiàn)一個(gè)Eureka服務(wù)非常簡(jiǎn)單:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

配置文件:

server.port=1111

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

服務(wù)提供者同樣簡(jiǎn)潔,只需要EnableDiscoveryClient

@EnableDiscoveryClient
@SpringBootApplication
public class HelloApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
}

提供controller:

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String index() {
        return "Hello Spring Boot";
    }
}

配置文件application.properties:

server.port=8888
spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://111.222.83.251:1111/eureka/

服務(wù)消費(fèi)者如下,通過(guò)url指明服務(wù)名稱(chēng)和接口,使用RestTemplate進(jìn)行http請(qǐng)求。

@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    public String helloService() {
        return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
    }
}

配置文件:

eureka.client.serviceUrl.defaultZone=http://111.222.83.251:1111/eureka/
Eureka的運(yùn)行

有三種方法可以運(yùn)行:

可以通過(guò)maven的編譯、打包,最后java -jar運(yùn)行。

spring-boot-maven-pluginmvn spring-boot:run運(yùn)行。

在Idea中直接啟動(dòng)main方法。

我本機(jī)java環(huán)境為9,在項(xiàng)目中設(shè)置的java為1.8,導(dǎo)致只有第3種方法有效,因?yàn)槠渌鼉煞N依賴(lài)于本機(jī)安裝的java運(yùn)行環(huán)境,盡量保持編譯環(huán)境和運(yùn)行環(huán)境一致。

服務(wù)提供者的運(yùn)行機(jī)制

Eureka用了雙層map結(jié)構(gòu)來(lái)維護(hù)注冊(cè)的服務(wù)信息,第一層Key為服務(wù)的名稱(chēng),第二層key為服務(wù)的實(shí)例名稱(chēng)。

當(dāng)某一個(gè)服務(wù)向一個(gè)Eureka節(jié)點(diǎn)注冊(cè)服務(wù)時(shí),Eureka會(huì)將該請(qǐng)求轉(zhuǎn)發(fā)給其它的Eureka節(jié)點(diǎn),從而可以同步服務(wù)注冊(cè)信息。

服務(wù)通過(guò)周期性的心跳來(lái)通知Eureka自己的情況,又稱(chēng)為服務(wù)續(xù)約(renew)。

服務(wù)消費(fèi)者的運(yùn)行機(jī)制

通過(guò)REST請(qǐng)求想Eureka獲取服務(wù)列表,周期性的更新服務(wù)列表緩存。

服務(wù)下線(xiàn)后,Eureka會(huì)通知給服務(wù)消費(fèi)者。

服務(wù)注冊(cè)中心的運(yùn)行機(jī)制

為了防止服務(wù)的異常下線(xiàn),會(huì)周期性的清理列表中未續(xù)約的服務(wù)。

Region和Zone

一個(gè)服務(wù)可以屬于一個(gè)Region和多個(gè)Zone。

服務(wù)用Region和Zone來(lái)刻畫(huà)自己所處的物理位置,方便負(fù)載均衡器就近的選擇同一個(gè)Zone服務(wù)。同時(shí),服務(wù)也可以根據(jù)Region和Zone來(lái)選擇應(yīng)該向哪個(gè)Eureka注冊(cè)。

客戶(hù)端負(fù)載均衡:Ribbon 用RestTemplate發(fā)送rest請(qǐng)求

Spring提供了方便的RestTemplate像目標(biāo)服務(wù)發(fā)送請(qǐng)求,有GET、POST、PUT和DELETE等基本操作。

如何讓客戶(hù)端具有負(fù)載均衡能力

LoadBalanced注解通過(guò)向RestTemplate添加攔截器,使其具備負(fù)載均衡的能力。

在服務(wù)消費(fèi)者中實(shí)現(xiàn)如下,在RestTemplate上加入LoadBalanced注解。

@SpringCloudApplication
public class RibbonConsumerApplication {

   @Bean
   @LoadBalanced
   RestTemplate restTemplate() {
       return new RestTemplate();
   }

   public static void main(String[] args) {
       SpringApplication.run(RibbonConsumerApplication.class, args);
   }
}
負(fù)載均衡器的基本功能

BaseLoaderBalancer

維護(hù)該服務(wù)下的所有節(jié)點(diǎn)列表。

定義IPing對(duì)象,會(huì)定時(shí)輪詢(xún)列表中的服務(wù),檢查服務(wù)是否存活。

定義負(fù)載均衡的規(guī)則IRule,這里是線(xiàn)性輪詢(xún)的策略。

定義添加、獲取服務(wù)的方法。

DynamicServerListLoadBalancer

在BaseLoaderBalancer基礎(chǔ)上實(shí)現(xiàn)了動(dòng)態(tài)獲取服務(wù)的能力,實(shí)現(xiàn)了從Eureka查詢(xún)服務(wù)的方法。

動(dòng)態(tài)的更新服務(wù)列表。策略有定時(shí)更新和Eureka提示更新兩種。

定義Filter過(guò)濾出需要的服務(wù)節(jié)點(diǎn),比如區(qū)域感知需求的服務(wù)會(huì)選擇同一個(gè)區(qū)域的其它服務(wù),比如根據(jù)服務(wù)的質(zhì)量評(píng)估節(jié)點(diǎn)健康狀況,選擇更健康的服務(wù)節(jié)點(diǎn)進(jìn)入列表。

ZoneAwareLoadBalancer

對(duì)DynamicServerListLoadBalancer進(jìn)一步擴(kuò)展,根據(jù)zone對(duì)服務(wù)實(shí)例劃分,然后采用策略先篩選zone,最后再選一個(gè)服務(wù)實(shí)例。

負(fù)載均衡的策略

RandomRule

隨機(jī)從列表中選擇一個(gè)

RoundRobbinRule

線(xiàn)性輪詢(xún)服務(wù)

RetryRule

在RoundRobbinRule基礎(chǔ)上進(jìn)行一定的重試

WeightedResponseTimeRule

根據(jù)服務(wù)節(jié)點(diǎn)的響應(yīng)時(shí)間,計(jì)算節(jié)點(diǎn)的權(quán)重,響應(yīng)時(shí)間短的更容易被選中。

其它。

采用自定義的過(guò)濾規(guī)則,先過(guò)濾出符合條件的節(jié)點(diǎn)結(jié)合,然后采用輪詢(xún)的方式依次使用。

服務(wù)容錯(cuò)保護(hù):Hystrix Hystrix的功能

服務(wù)降級(jí)、服務(wù)熔斷、線(xiàn)程和信號(hào)隔離、請(qǐng)求緩存、請(qǐng)求合并以及服務(wù)監(jiān)控等。

為依賴(lài)的服務(wù)提供艙壁

對(duì)于每一個(gè)依賴(lài)的服務(wù),Hystrix提供了專(zhuān)用的線(xiàn)程池,防止某個(gè)依賴(lài)服務(wù)影響其它的依賴(lài)服務(wù),這種模式叫做“艙壁模式”(Bulkhead Pattern)。

斷路器實(shí)現(xiàn)邏輯

Hystrix通過(guò)注解EnableCircuitBreakerhystrixCommand提供了斷路保護(hù)功能,在下游服務(wù)調(diào)用產(chǎn)生異常時(shí)進(jìn)行功能降級(jí)。

在如下條件下打開(kāi)斷路器:

在每秒請(qǐng)求數(shù)量QPS大于閾值時(shí)。

在錯(cuò)誤百分比大于閾值時(shí)。

當(dāng)斷路器打開(kāi)時(shí),如果打開(kāi)時(shí)間已經(jīng)到達(dá)設(shè)定睡眠時(shí)間,則去嘗試發(fā)送請(qǐng)求,測(cè)試下游服務(wù)是否已經(jīng)恢復(fù)正常,如果請(qǐng)求成功,則關(guān)閉斷路器,恢復(fù)正常。

保留10秒的bucket歷史數(shù)據(jù),記錄請(qǐng)求成功、失敗、延遲和拒絕次數(shù)作為開(kāi)閉斷路器的依據(jù)。

消費(fèi)者端實(shí)現(xiàn)如下:

@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "helloFallback")
    public String helloService() {
        return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
    }

    public String helloFallback() {
        return "error";
    }
}
怎么減少網(wǎng)絡(luò)請(qǐng)求?Hystrix提供了緩存功能

根據(jù)請(qǐng)求參數(shù),想結(jié)果緩存入線(xiàn)程安全的map結(jié)構(gòu)。

Hystrix提供了CacheResult來(lái)實(shí)現(xiàn)緩存。

還能怎么減少網(wǎng)絡(luò)請(qǐng)求?Hystrix提供了合并請(qǐng)求的功能

Hystrix提供了HystrixCollapser進(jìn)行請(qǐng)求的合并,將一小段時(shí)間內(nèi)的請(qǐng)求合并為一個(gè),不僅減少了網(wǎng)絡(luò)請(qǐng)求的次數(shù),同時(shí)減少了線(xiàn)程池資源的占用。

聲明式服務(wù)調(diào)用:Feign

Feign整合了Ribbon和Hystrix,除了這兩者的功能,還提供了聲明式的Web服務(wù)客戶(hù)端的定義方式。

在調(diào)用其它服務(wù)時(shí),可以通過(guò)如下簡(jiǎn)單封裝實(shí)現(xiàn)。FeignClient指明了服務(wù)的名稱(chēng),RequestMapping指明了服務(wù)的具體接口。和傳統(tǒng)的方式相比,更為簡(jiǎn)潔方便。

@FeignClient("hello-service")
public interface HelloService {
    @RequestMapping("/hello")
    String hello();
}
客戶(hù)端和服務(wù)端共享接口定義

Feign在客戶(hù)端聲明的服務(wù)接口和服務(wù)端定義的接口是對(duì)應(yīng)的,可以說(shuō)形式完全相同。所以,可以將這些接口發(fā)布出來(lái),供客戶(hù)端和服務(wù)端共同使用,從而減少客戶(hù)端綁定配置。

API網(wǎng)關(guān)服務(wù):Zuul

Zuul針對(duì)外部客戶(hù)端的訪(fǎng)問(wèn),提供了請(qǐng)求路由、負(fù)載均衡和校驗(yàn)過(guò)濾等基本功能,還有與服務(wù)治理結(jié)合、請(qǐng)求轉(zhuǎn)發(fā)的熔斷機(jī)制、服務(wù)的聚合等。

創(chuàng)建一個(gè)簡(jiǎn)單的zuul,首先開(kāi)啟zuul:

@EnableZuulProxy
@SpringBootApplication
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}

配置路由規(guī)則:

spring.application.name=api-gateway
server.port=5555

zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=hello-service

zuul.routes.api-b.path=/api-b/**
zuul.routes.api-b.serviceId=feign-consumer

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

每一個(gè)路由規(guī)則包含兩個(gè)部分,path指明了外部訪(fǎng)問(wèn)的url,對(duì)應(yīng)的serviceId指明了所要映射到的服務(wù)。

Zuul的過(guò)濾器

Zuul不僅做路由轉(zhuǎn)發(fā),還會(huì)對(duì)請(qǐng)求進(jìn)行過(guò)濾。過(guò)濾會(huì)在請(qǐng)求的各個(gè)階段執(zhí)行:

pre:在請(qǐng)求到達(dá)網(wǎng)關(guān)API時(shí)的階段,先做一些前置加工。

routing:在請(qǐng)求已經(jīng)開(kāi)始路由到目標(biāo)服務(wù)器時(shí),進(jìn)行處理。

error:該過(guò)濾器在上述兩階段拋出異常時(shí),會(huì)進(jìn)入該階段進(jìn)行處理,該階段一般會(huì)在上下文中設(shè)置error標(biāo)志,告訴port階段返回適當(dāng)?shù)膃rror信息。當(dāng)然該階段有時(shí)候會(huì)在post階段之后出現(xiàn),因?yàn)閜ost階段也可能拋出異常,這就導(dǎo)致客戶(hù)端可能無(wú)法收到返回的信息,當(dāng)然,有多種解決該問(wèn)題的方法,不再贅述。

post:在目標(biāo)服務(wù)將結(jié)果返回后,可以對(duì)返回值進(jìn)行處理,然后將正確的返回值或者error信息返回給客戶(hù)端。

其實(shí)Zuul的過(guò)濾器更像是設(shè)計(jì)模式中的責(zé)任鏈或者h(yuǎn)andler,一個(gè)請(qǐng)求在收到、轉(zhuǎn)發(fā)、返回的各個(gè)階段里,由多個(gè)過(guò)濾器依次處理。

Zuul動(dòng)態(tài)加載路由配置和過(guò)濾器

Zuul結(jié)合Spring Cloud Config,可以動(dòng)態(tài)的獲取配置信息,從而可以實(shí)現(xiàn)動(dòng)態(tài)的更新路由。

Zuul結(jié)合Groovy等動(dòng)態(tài)語(yǔ)言,可以在運(yùn)行時(shí)動(dòng)態(tài)的加載自定義的過(guò)濾器。

分布式配置中心:Config

創(chuàng)建一個(gè)Config server十分容易,首先創(chuàng)建一個(gè)遠(yuǎn)程git倉(cāng)庫(kù),我在碼云中創(chuàng)建了https://gitee.com/tiantianchi...。

創(chuàng)建spring boot項(xiàng)目,加入如下配置:

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

在application.properties中加入:

spring.application.name=config-server
server.port=7001

spring.cloud.config.server.git.uri=https://gitee.com/tiantianchi/spring-config
spring.cloud.config.server.git.searchPaths=config-repo
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password

在倉(cāng)庫(kù)中創(chuàng)建配置文件tc-dev.properties,然后通過(guò)http://localhost:7001/tc/dev可以訪(fǎng)問(wèn)其中的配置內(nèi)容。

Config客戶(hù)端的實(shí)現(xiàn)如下,首先創(chuàng)建配置文件boostrap.properties文件,填入如下配置:

spring.application.name=tc
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7001/

server.port=7002

客戶(hù)端就可以從Config server中獲取tc-dev.properties配置文件。

消息總線(xiàn):Bus

Spring Cloud Bus依賴(lài)于現(xiàn)有的消息隊(duì)列框架,如RabbitMQ和Kafka,實(shí)現(xiàn)微服務(wù)之間異步消息的發(fā)布和訂閱。

可以利用Bus實(shí)現(xiàn)配置的自動(dòng)更新。在git倉(cāng)庫(kù)中的配置發(fā)生變化時(shí),通過(guò)hook將更新請(qǐng)求發(fā)送到Config服務(wù),Config通過(guò)Bus發(fā)送給相關(guān)服務(wù),告知其進(jìn)行配置的更新。

在Bus中,將RabbitMQ等工具作為消息發(fā)布和獲取的代理。每個(gè)服務(wù)中,由Listener負(fù)責(zé)監(jiān)聽(tīng)和處理事件,EventPublisher負(fù)責(zé)與消息代理進(jìn)行通信,它會(huì)收到本地發(fā)送的事件,并且發(fā)送到代理中,同時(shí)從代理中獲取事件,發(fā)回給本地注冊(cè)的Listener。Endpoint則負(fù)責(zé)暴露API,用戶(hù)可以通過(guò)Endpoint提供的接口發(fā)起事件,Endpoint會(huì)利用EventPublisher將事件發(fā)到消息代理中。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/70718.html

相關(guān)文章

  • SpringCloud微服務(wù)實(shí)戰(zhàn)

    摘要:序主要有做服務(wù)發(fā)現(xiàn)做分布式配置做做客戶(hù)端負(fù)載均衡做斷路器做聚合的做指標(biāo)監(jiān)控。配置訪(fǎng)問(wèn)配置訪(fǎng)問(wèn)實(shí)例調(diào)用其他微服務(wù)使用使用訪(fǎng)問(wèn)轉(zhuǎn)向使用訪(fǎng)問(wèn)配置的目前看來(lái)每秒發(fā)送一次貌似太頻繁可以另起一個(gè)進(jìn)行訪(fǎng)問(wèn)參考 序 主要有eureka做服務(wù)發(fā)現(xiàn)、config做分布式配置、zuul做api-gateway、feign做客戶(hù)端負(fù)載均衡、hystrix做斷路器、turbine做聚合的monitor、grap...

    Dr_Noooo 評(píng)論0 收藏0
  • SpringCloud微服務(wù)實(shí)戰(zhàn)

    摘要:序主要有做服務(wù)發(fā)現(xiàn)做分布式配置做做客戶(hù)端負(fù)載均衡做斷路器做聚合的做指標(biāo)監(jiān)控。配置訪(fǎng)問(wèn)配置訪(fǎng)問(wèn)實(shí)例調(diào)用其他微服務(wù)使用使用訪(fǎng)問(wèn)轉(zhuǎn)向使用訪(fǎng)問(wèn)配置的目前看來(lái)每秒發(fā)送一次貌似太頻繁可以另起一個(gè)進(jìn)行訪(fǎng)問(wèn)參考 序 主要有eureka做服務(wù)發(fā)現(xiàn)、config做分布式配置、zuul做api-gateway、feign做客戶(hù)端負(fù)載均衡、hystrix做斷路器、turbine做聚合的monitor、grap...

    Tamic 評(píng)論0 收藏0
  • 恕我直言,你可能誤解了微服務(wù)

    摘要:劉超,網(wǎng)易云計(jì)算首席架構(gòu)師,有多年的云計(jì)算架構(gòu)與開(kāi)發(fā)經(jīng)歷,積累了豐富的企業(yè)級(jí)應(yīng)用的微服務(wù)化,容器化實(shí)戰(zhàn)經(jīng)驗(yàn)。近日,記者對(duì)劉超進(jìn)行了采訪(fǎng),跟大家分享了微服務(wù)實(shí)戰(zhàn)的挑戰(zhàn)和一些常見(jiàn)的微服務(wù)誤解,以及他對(duì)微服務(wù)發(fā)展趨勢(shì)的判斷。 劉超,網(wǎng)易云計(jì)算首席架構(gòu)師,有10多年的云計(jì)算架構(gòu)與開(kāi)發(fā)經(jīng)歷,積累了豐富的企業(yè)級(jí)應(yīng)用的微服務(wù)化,容器化實(shí)戰(zhàn)經(jīng)驗(yàn)。劉超將擔(dān)任今年 5 月份 QCon 全球軟件開(kāi)發(fā)大會(huì)廣州...

    AlphaGooo 評(píng)論0 收藏0
  • 從小白程序員一路晉升為大廠(chǎng)高級(jí)技術(shù)專(zhuān)家我看過(guò)哪些書(shū)籍?(建議收藏)

    摘要:大家好,我是冰河有句話(huà)叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國(guó)慶假期了,給小伙伴們分享下,從小白程序員到大廠(chǎng)高級(jí)技術(shù)專(zhuān)家我看過(guò)哪些技術(shù)類(lèi)書(shū)籍。 大家好,我是...

    sf_wangchong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

chunquedong

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<