如何做網(wǎng)站制作seo的定義
介紹
Consul 是一套開(kāi)源的分布式服務(wù)發(fā)現(xiàn)和配置管理系統(tǒng),由 HashiCorp 公司用 Go 語(yǔ)言開(kāi)發(fā)。
提供了微服務(wù)系統(tǒng)中的服務(wù)治理、配置中心、控制總線等功能。這些功能中的每一個(gè)都可以根據(jù)需要單獨(dú)使用,也可以一起使用以構(gòu)建全方位的服務(wù)網(wǎng)格,總之Consul提供了一種完整的服務(wù)網(wǎng)格解決方案。它具有很多優(yōu)點(diǎn)。包括: 基于 raft 協(xié)議,比較簡(jiǎn)潔; 支持健康檢查, 同時(shí)支持 HTTP 和 DNS 協(xié)議 支持跨數(shù)據(jù)中心的 WAN 集群 提供圖形界面 跨平臺(tái),支持 Linux、Mac、Windows
簡(jiǎn)言之,Consul的作用是服務(wù)發(fā)現(xiàn)和配置管理
Consul的作用
- 服務(wù)發(fā)現(xiàn):提供HTTP和DNS兩種發(fā)現(xiàn)方式。
- 健康檢測(cè):支持多種方式,HTTP、TCP、Docker、Shell腳本定制化監(jiān)控
- kv存儲(chǔ):Key、Value的存儲(chǔ)方式
- 多數(shù)據(jù)中心:Consul支持多數(shù)據(jù)中心
- 可視化Web界面
服務(wù)注冊(cè)與發(fā)現(xiàn)
步驟:
- pom文件中引入consul服務(wù)注冊(cè)與發(fā)現(xiàn)的依賴
<!--SpringCloud consul discovery --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency>
- yaml文件中做好consul的相關(guān)配置,例:
spring:application:name: cloud-consumer-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #優(yōu)先使用服務(wù)ip進(jìn)行注冊(cè)service-name: ${spring.application.name}
- 在啟動(dòng)類(lèi)上加上@EnableDiscoveryClient
- 在RestTemplateConfig配置類(lèi)中,創(chuàng)建RestTemplate組件的方法上,加上負(fù)載均衡支持的注解
@Configuration
public class RestTemplateConfig
{@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
- 在要引用服務(wù)的地址的時(shí)候,就可以將原來(lái)的 ip地址:端口號(hào) 改為對(duì)應(yīng)的服務(wù)名
public static final String PaymentSrv_URL = "<http://cloud-payment-service>";
分布式配置
微服務(wù)意味著要將單體應(yīng)用中的業(yè)務(wù)拆分成一個(gè)個(gè)子服務(wù),每個(gè)服務(wù)的粒度相對(duì)較小,因此系統(tǒng)中會(huì)出現(xiàn)大量的服務(wù)。由于每個(gè)服。務(wù)都需要必要的配置信息才能運(yùn)行,所以一套集中式的、動(dòng)態(tài)的配置管理設(shè)施是必不可少的。
服務(wù)配置:
配置通用全局配置信息,直接注冊(cè)進(jìn)Consul服務(wù)器,從Consul獲取配置信息:
- pom中加入依賴:
<!--SpringCloud consul config-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
-
關(guān)于bootstrap.yaml文件:
applicaiton.yml是用戶級(jí)的資源配置項(xiàng)
bootstrap.yml是系統(tǒng)級(jí)的,優(yōu)先級(jí)更加高
Spring Cloud會(huì)創(chuàng)建一個(gè)“Bootstrap Context”,作為Spring應(yīng)用的
Application Context
的父上下文。初始化的時(shí)候,Bootstrap Context
負(fù)責(zé)從外部源加載配置屬性并解析配置。這兩個(gè)上下文共享一個(gè)從外部獲取的Environment
。Bootstrap
屬性有高優(yōu)先級(jí),默認(rèn)情況下,它們不會(huì)被本地配置覆蓋。Bootstrap context
和Application Context
有著不同的約定,所以新增了一個(gè)bootstrap.yml
文件,保證Bootstrap Context
和Application Context
配置的分離。application.yml文件改為bootstrap.yml,這是很關(guān)鍵的或者兩者共存,一般推薦兩者共存。
因?yàn)閎ootstrap.yml是比application.yml先加載的。bootstrap.yml優(yōu)先級(jí)高于application.yml
例:
spring:application:name: cloud-payment-service####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-' # default value is ",",we update '-'format: YAML
接著在consul中配置好kv配置信息,要讀取配置信息,也是和讀取普通配置文件中的信息一樣,使用@Value注解獲取。
kv信息的配置格式為config/服務(wù)名-運(yùn)行環(huán)境/data,最終的配置信息在data中配置,可以使用yaml的格式。
及時(shí)動(dòng)態(tài)刷新
在consul中的配置信息修改后,立即訪問(wèn)時(shí)候,不會(huì)生效,要等待一會(huì)才會(huì)刷新。
解決步驟:
-
添加@RefreshScope注解到主啟動(dòng)類(lèi)上
-
修改watch的wait-time(不建議)
spring:application:name: cloud-payment-service####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-' # default value is ",",we update '-'format: YAMLwatch:wait-time: 1
LoadBanlancer負(fù)載均衡調(diào)用
LB負(fù)載均衡(Load Balance):
簡(jiǎn)單的說(shuō)就是將用戶的請(qǐng)求平攤的分配到多個(gè)服務(wù)上,從而達(dá)到系統(tǒng)的HA(高可用),常見(jiàn)的負(fù)載均衡有軟件Nginx,LVS,硬件 F5等。
spring-cloud-starter-loadbalancer組件是什么:
Spring Cloud LoadBalancer是由SpringCloud官方提供的一個(gè)開(kāi)源的、簡(jiǎn)單易用的客戶端負(fù)載均衡器,它包含在SpringCloud-commons中用它來(lái)替換了以前的Ribbon組件。相比較于Ribbon,SpringCloud LoadBalancer不僅能夠支持RestTemplate,還支持WebClient(WeClient是Spring Web Flux中提供的功能,可以實(shí)現(xiàn)響應(yīng)式異步請(qǐng)求)
在負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求的rest服務(wù)客戶端,做負(fù)載均衡。導(dǎo)入以下依賴,并在RestTemplateConfig的組件配置中,加上@LoadBalanced注解
<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
原理
LoadBalance在工作時(shí)分為兩步:
- 第一步,先選擇ConsulServer從服務(wù)端查詢服務(wù)列表,默認(rèn)輪詢調(diào)用誰(shuí)都可以正常執(zhí)行。
- 第二步,按照指定的負(fù)載均衡策略從server取到的服務(wù)注冊(cè)中由客戶端自己選擇一個(gè)地址,所以LoadBalancer是一個(gè)客戶端的負(fù)載均衡器
負(fù)載均衡輪詢算法:rest接口第幾次請(qǐng)求數(shù) % 服務(wù)器集群總數(shù)量 = 實(shí)際調(diào)用服務(wù)器位置下標(biāo) ,每次服務(wù)重啟動(dòng)后rest接口計(jì)數(shù)從1開(kāi)始。
默認(rèn)是兩種算法,除了輪詢算法,還有一種是隨機(jī)算法。如果要使用隨機(jī)算法,RestTemplateConfig配置如下:
@Configuration
@LoadBalancerClient(//下面的value值大小寫(xiě)一定要和consul里面的名字一樣,必須一樣value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig
{@Bean@LoadBalanced //使用@LoadBalanced注解賦予RestTemplate負(fù)載均衡的能力public RestTemplate restTemplate(){return new RestTemplate();}@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
一般還是建議使用默認(rèn)的輪詢算法。
OpenFeign服務(wù)接口調(diào)用
openFeign是一個(gè)聲明式的服務(wù)客戶端。也支持并包含了loadBalanced。
官方介紹文:
它使編寫(xiě)web服務(wù)客戶端變得更容易。使用Feign創(chuàng)建一個(gè)接口并對(duì)其進(jìn)行注釋。它具有可插入的注釋支持,包括Feign注釋和JAX-RS注釋。Feign還支持可插拔編碼器和解碼器。Spring Cloud添加了對(duì)Spring MVC注釋的支持,以及對(duì)使用Spring Web中默認(rèn)使用的HttpMessageConverter的支持。Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker以及Spring Cloud LoadBalancer,以便在使用Feign時(shí)提供負(fù)載平衡的http客戶端。
由于對(duì)服務(wù)依賴的調(diào)用可能不止一處,往往一個(gè)接口會(huì)被多處調(diào)用,所以通常都會(huì)針對(duì)每一個(gè)微服務(wù)自行封裝一些客戶端類(lèi)來(lái)包裝這些依賴服務(wù)的調(diào)用。所以O(shè)penFeign在此基礎(chǔ)上做了進(jìn)一步封裝,幫助我們定義和實(shí)現(xiàn)依賴服務(wù)接口的定義。
可以在使用OpenFeign式提供http客戶端的負(fù)載均衡,也可以集成阿里巴巴的Sentinel來(lái)提供熔斷降級(jí)等功能。通過(guò)OpenFeign只需要服務(wù)綁定接口且以聲明式的方法,優(yōu)雅而簡(jiǎn)單的實(shí)現(xiàn)了服務(wù)調(diào)用
使用步驟:
- 建好服務(wù)客戶端模塊后,引入依賴:
<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- yaml文件:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #優(yōu)先使用服務(wù)ip進(jìn)行注冊(cè)service-name: ${spring.application.name}
- 主啟動(dòng)類(lèi)上加上consul的支持注冊(cè)服務(wù)的注解和啟用feign客戶端的注解
@SpringBootApplication
@EnableDiscoveryClient //該注解用于向使用consul為注冊(cè)中心時(shí)注冊(cè)服務(wù)
@EnableFeignClients//啟用feign客戶端,定義服務(wù)+綁定接口,以聲明式的方法優(yōu)雅而簡(jiǎn)單的實(shí)現(xiàn)服務(wù)調(diào)用
public class MainOpenFeign80 {public static void main(String[] args) {SpringApplication.run(MainOpenFeign80.class,args);}
}
- 在通用模塊commons中引入依賴(如上)后,新建服務(wù)接口PayFeignApi,在接口上配置@FeignClient注解,并定義好抽象方法,抽象方法的定義要對(duì)應(yīng)的服務(wù)的controller類(lèi)中的controller方法。相應(yīng)的mapping注解也要對(duì)應(yīng)好。
@FeignClient("cloud-payment-service")
public interface PayFeignApi {@PostMapping(value = "/pay/add")public ResultData<String> addPay(@RequestBody Pay pay);@DeleteMapping("pay/del/{id}")public ResultData<Integer> deletePay(@PathVariable("id") Integer id);@PutMapping("/pay/update")public ResultData<String> updatePay(@RequestBody PayDTO payDto);@GetMapping("/pay/get/{id}")public ResultData<Pay> getById(@PathVariable("id") Integer id);@GetMapping("/pay/getAll")public ResultData<List<Pay>> getAll();
}
- 在服務(wù)客戶端的controller中調(diào)用payFeignApi
@RestController
public class OrderController {@Resourceprivate PayFeignApi payFeignApi;@PostMapping("/feign/pay/add")public ResultData addOrder(@RequestBody Pay pay){ResultData<String> resultData = payFeignApi.addPay(pay);return resultData;}@GetMapping("/feign/pay/get/{id}")public ResultData getPayInfo(@PathVariable("id") Integer id){System.out.println("-------支付微服務(wù)遠(yuǎn)程調(diào)用,按照id查詢訂單支付流水信息");ResultData resultData = payFeignApi.getById(id);return resultData;}
}
OpenFeign高級(jí)特性
超時(shí)控制
在SpringCloud微服務(wù)架構(gòu)中,大部分公司都是利用OpenFeign進(jìn)行服務(wù)間的調(diào)用,如果服務(wù)要進(jìn)行比較繁雜的業(yè)務(wù)計(jì)算,那后臺(tái)很有可能會(huì)出現(xiàn)Read Timeout這個(gè)異常,因此定制化配置超時(shí)時(shí)間就非常有必要了。
openFeign默認(rèn)等待六十秒,超時(shí)后會(huì)報(bào)錯(cuò)。
關(guān)于超時(shí)控制的配置項(xiàng):
- connectTimeOut:連接超時(shí)時(shí)間
- readTimeOut:請(qǐng)求處理超時(shí)時(shí)間
配置分為兩種:
全局配置
直接在application.yaml文件中進(jìn)行配置:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #優(yōu)先使用服務(wù)ip進(jìn)行注冊(cè)service-name: ${spring.application.name}openfeign:client:config:default:#連接超時(shí)時(shí)間connectTimeout: 3000#讀取超時(shí)時(shí)間readTimeout: 3000
指定配置
就是config的下一級(jí)屬性的屬性名改為要指定的服務(wù)的服務(wù)名,default的同級(jí)
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #優(yōu)先使用服務(wù)ip進(jìn)行注冊(cè)service-name: ${spring.application.name}openfeign:client:config:default:#連接超時(shí)時(shí)間connectTimeout: 3000#讀取超時(shí)時(shí)間readTimeout: 3000cloud-provider-payment:#連接超時(shí)時(shí)間connectTimeout: 5000#讀取超時(shí)時(shí)間readTimeout: 5000
服務(wù)的超時(shí)配置先看指定的,再看全局的。
重試機(jī)制
重試是指當(dāng)請(qǐng)求失敗后,會(huì)重新再次發(fā)送該請(qǐng)求。在OpenFeign中默認(rèn)是關(guān)閉重試的,如果要開(kāi)啟重試,在配置類(lèi)FeignConfig中設(shè)置:
@Configuration
public class FeignConfig {@Beanpublic Retryer myRetryer(){//return Retryer.NEVER_RETRY; //Feign默認(rèn)配置是不走重試策略的//最大請(qǐng)求次數(shù)為3(1+2),初始間隔時(shí)間為100ms,重試間最大間隔時(shí)間為1sreturn new Retryer.Default(100,1,3);}
}
HttpClient
OpenFeign中http client如果不做特殊配置,默認(rèn)使用jdk自帶的HttpURLConnection發(fā)送HTTP請(qǐng)求,由于默認(rèn)HttpURLConnection沒(méi)有連接池、性能和效率低,如果采用默認(rèn),性能上欠佳。
建議使用阿帕奇的httpclient5。
步驟:
-
pom引入依賴
<!-- httpclient5--> <dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.3</version> </dependency> <!-- feign-hc5--> <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-hc5</artifactId><version>13.1</version> </dependency>
-
開(kāi)啟httpclient5的配置,application.yaml文件:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #優(yōu)先使用服務(wù)ip進(jìn)行注冊(cè)service-name: ${spring.application.name}openfeign:client:config:default:connect-timeout: 3000read-timeout: 3000cloud-provider-payment:#連接超時(shí)時(shí)間connectTimeout: 5000#讀取超時(shí)時(shí)間readTimeout: 5000# 配置httpclient5httpclient:hc5:enabled: true
請(qǐng)求響應(yīng)壓縮
Spring Cloud OpenFeign支持對(duì)請(qǐng)求和響應(yīng)進(jìn)行GZIP壓縮,以減少通信過(guò)程中的性能損耗。還可以對(duì)請(qǐng)求壓縮做一些更細(xì)致的設(shè)置,比如指定壓縮的請(qǐng)求數(shù)據(jù)類(lèi)型并設(shè)置了請(qǐng)求壓縮的大小下限。
application.yaml配置文件:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #優(yōu)先使用服務(wù)ip進(jìn)行注冊(cè)service-name: ${spring.application.name}openfeign:client:config:default:connect-timeout: 3000read-timeout: 3000cloud-provider-payment:#連接超時(shí)時(shí)間connectTimeout: 5000#讀取超時(shí)時(shí)間readTimeout: 5000httpclient:hc5:enabled: truecompression:request:enabled: truemin-request-size: 2048 #最小觸發(fā)壓縮的大小,單位 字節(jié)mime-types: text/xml,application/xml,application/json #觸發(fā)壓縮數(shù)據(jù)類(lèi)型response:enabled: true
日志打印
Feign提供了日志打印功能,可以通過(guò)配置來(lái)調(diào)整日志級(jí)別,從而了解feign中http請(qǐng)求的細(xì)節(jié),也就是對(duì)Feign接口的調(diào)用情況進(jìn)行監(jiān)控和輸出。
日志級(jí)別
NONE:默認(rèn)的,不顯示任何日志;
BASIC:僅記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)碼及執(zhí)行時(shí)間;
HEADERS:除了 BASIC 中定義的信息之外,還有請(qǐng)求和響應(yīng)的頭信息;
FULL:除了 HEADERS 中定義的信息之外,還有請(qǐng)求和響應(yīng)的正文及元數(shù)據(jù)。
配置方式:
- 在FeignConfig中,配置:
@Configuration
public class FeignConfig {@Beanpublic Retryer myRetryer(){//return Retryer.NEVER_RETRY; //Feign默認(rèn)配置是不走重試策略的//最大請(qǐng)求次數(shù)為3(1+2),初始間隔時(shí)間為100ms,重試間最大間隔時(shí)間為1sreturn new Retryer.Default(100,1,3);}//配置日志級(jí)別@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}
- 在yaml文件中配置,配置公式是:logging.level?+?含有@FeignClient注解的完整帶包名的接口名+debug,例如:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #優(yōu)先使用服務(wù)ip進(jìn)行注冊(cè)service-name: ${spring.application.name}openfeign:client:config:default:connect-timeout: 3000read-timeout: 3000cloud-provider-payment:#連接超時(shí)時(shí)間connectTimeout: 5000#讀取超時(shí)時(shí)間readTimeout: 5000httpclient:hc5:enabled: truecompression:request:enabled: truemin-request-size: 2048 #最小觸發(fā)壓縮的大小mime-types: text/xml,application/xml,application/json #觸發(fā)壓縮數(shù)據(jù)類(lèi)型response:enabled: true
#日志配置
logging:level:com:ergou:cloud:apis:PayFeignApi: debug