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