javascript
Spring Boot----Dubbo
概述
治理和維護各個分系統
參考官網:http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html?(可中英文切換)
?
下載安裝Zookeeper
linux
使用docker部署
windows: 參考(https://blog.csdn.net/ring300/article/details/80446918),下載的zookeeper目錄中需要包含lib(內置jar包,否則需要自己導入)
1、將conf目錄下的zoo_sample.cfg文件,復制粘貼一份,重命名為zoo.cfg
2、創建data目錄和log目錄
3、修改zoo.cfg 文件中的
dataDir=D:\Zookeeper\data datalogDir=D:\Zookeeper\log4、啟動 雙擊?zkServer.cmd
對zoo.cfg文件配置說明
tickTime:這個時間是作為 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這里所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接
時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度后 Zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是
10*2000=20 秒
syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 5*2000=10 秒
dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日志文件也保存在這個目錄里。
clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
?
搭建Dubbo Admin
源碼下載:https://github.com/apache/dubbo-admin/tree/master(注意是master分支,dubbo admin好像在重構)
具體操作請看官方文檔。
修改 dubbo-admin-master\dubbo-admin\src\main\resources\application.properties中的Zookeeper地 cd dubbo-admin-master\dubbo-admin mvn clean package :將所有模塊進行打包 cd target java -jar dubbo-admin-0.0.1-SNAPSHOT.jar訪問:localhost:7001? 密碼和用戶名都是root
?
搭建Dubbo Monitor
在搭建dubbo admin是下載的文件夾中有一個dubbo-monitor-simple(一個建檔的監控信息配置)
cd dubbo-admin-master\dubbo-monitor-simple mvn clean package cd target 解壓 dubbo-monitor-simple-2.0.0-assembly.tar.gz 修改 \dubbo-monitor-simple-2.0.0\conf\dubbo.properties (修改zookeeper地址等) cd assembly.bin 雙擊 start.bat需要配置application.yml:參考??http://dubbo.apache.org/en-us/docs/user/references/xml/dubbo-monitor.html
使用是整個demo測試正常,但是monitor使用不成功,查看日志:java.lang.ClassNotFoundException: org.apache.dubbo.common.URL(未解決),后來查看日志沒有報錯了,但是還是不成功
?
?
1、Dubbo一些基本使用
注意問題:測試的時候,如果provider修改了,consumer服務器有時候也需要重啟,不知道為什么?
1.1 Dubbo 啟動配置的加載順序
JVM -D參數 > xml > properties
參考:http://dubbo.apache.org/zh-cn/docs/user/configuration/properties.html
1.2 超時,配置覆蓋規則
參考:http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html?(不同粒度之間的覆蓋關系)
1.3 Dubbo 啟動時檢測配置
參考;http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html
dubbo 缺省配置:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-consumer.html
1.4 重試次數
注意冪等請求可以設置重試,非冪等不能設置重試
參考:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-consumer.html
1.5 關于xml
http://dubbo.apache.org/zh-cn/docs/user/configuration/properties.html
1.6 關于配置
可以使用dubbo.xml,application.properties,也可以使用注解@Service(version="xx",timeout=1)。。
1.7? 多版本
一個 provider 接口被多個實現類實現
服務提供者實現多個版本的實現
@Service(version = "0.0.1") public class UserServiceImpl implements ProviderService{}服務消費者指定版本
@Reference(version = "0.0.2") ProviderService providerService;1.8 本地存根
1、對于consumer,需要調用providerService
@Reference(version = "0.0.2") ProviderService providerService;2、我們需要在創建ProviderService接口的實現類
public class ProviderServiceStub implements ProviderService {@ReferenceProviderService providerService;//必須創建一個有參構造器//providerService 傳入的遠程代理對象public ProviderServiceStub(ProviderService providerService) {this.providerService = providerService;}@Overridepublic String providerMethod() {if (false){System.out.println("true");String s = providerService.providerMethod();return s;}System.out.println("false");return "空";} }3 修改?@Reference
@Reference(version = "0.0.2",stub = "com.zy.dubbo.service.Impl.ProviderServiceStub") ProviderService providerService;xml的配置可以參考官方文檔:http://dubbo.apache.org/zh-cn/docs/user/demos/local-stub.html
1.8 Dubbo的?@EnableDubbo的作用
主要目的就是進行包掃描的,掃描所有的?org.apache.dubbo.config.annotation.Service;
@EnableDubbo(scanBasePackages="com.zy.dubbo.service.Impl")可以指定具體的包掃描
1.9 springboot?使用xml配置dubbo
只需要使用 @ImportResource(value = {"classpath:provider.xml"}) 加載springboot啟動類上,之前的所有的注解@Service,@EnableDubbo,@Reference,全部通過xml配置。
1.10 springboot 使用API配置dubbo
單單使用注解的方式,對于Dubbo:method 不方便操作。所以我們也可以采用使用注解加API結合的模式配合dubbo
官網文檔:http://dubbo.apache.org/zh-cn/docs/user/configuration/api.html
如果配置了?public ServiceConfig<ProviderService> serviceConfig(ProviderService providerServiceImpl){},表示往注冊中心注冊了一個服務,所以不需要使用@EnableDubbo和@Service
以提供者配置為例
@Configuration public class DubboConfig {@Beanpublic ApplicationConfig applicationConfig(){ApplicationConfig application = new ApplicationConfig();application.setName("provider");return application;}@Beanpublic RegistryConfig registryConfig(){RegistryConfig registryConfig = new RegistryConfig();registryConfig.setAddress("zookeeper://localhost:2181");return registryConfig;}@Beanpublic MonitorConfig monitorConfig(){MonitorConfig monitorConfig = new MonitorConfig();monitorConfig.setProtocol("registry");return monitorConfig;}//暴露單個服務,對于ProviderServiceImpl,spring會自動從容器中拿,(可以是實現類,也可以是接口,測試的時候,如果有多個接口實現類且加上@Component// 會選擇其中一個實現類,所以最好使用實現類)//注解中的 @Service@Beanpublic ServiceConfig<ProviderService> serviceConfig(ProviderServiceImpl02 providerServiceImpl){ServiceConfig<ProviderService> serviceConfig = new ServiceConfig<>();serviceConfig.setInterface(ProviderService.class);serviceConfig.setRef(providerServiceImpl);serviceConfig.setVersion("0.0.3");List<MethodConfig> methods = new ArrayList<MethodConfig>();MethodConfig method = new MethodConfig();method.setName("providerMethod");method.setTimeout(3000);method.setRetries(0);methods.add(method);serviceConfig.setMethods(methods);serviceConfig.setApplication(applicationConfig());serviceConfig.setRegistry(registryConfig());serviceConfig.export();return serviceConfig;}; }但是如果使用API配置額外需要使用注解往注冊中心注冊服務,我們就需要@EnableDubbo和@Service來注冊服務了,此時我們注冊中心就會有三個服務,并且版本0.0.3的providerMethod還設置了超時
@Service(version = "0.0.1") @Component public class ProviderServiceImpl implements ProviderService {@Overridepublic String providerMethod(){System.out.println("消費者提供服務成功");return "0.0.1";} } ------------------------------------------------------------------ @Service(version = "0.0.2") @Component public class ProviderServiceImpl02 implements ProviderService {@Overridepublic String providerMethod() {System.out.println("消費者提供服務成功2");return "0.0.2";} }1.11 Dubbo 高可用
如果Zookeeper宕機了,如果服務之間之前訪問過,會在本地創建緩存通訊,即使zookeeper宕機了,服務之間既然能夠訪問,原因在于dubbo可以直連
所以即使沒有注冊中心,服務之間依然可以相互通訊
可以測試
@Reference(url = "localhost:20881")1.12 dubbo負載均衡
官方文檔:http://dubbo.apache.org/zh-cn/docs/user/demos/loadbalance.html
隨機算法(基于權重) Random LoadBalance
輪詢算法? ?RoundRobin LoadBalance
最少活躍數算法:LeastActive LoadBalance(每次調用服務器后在本地有對應的響應時間,下次調用選擇一個最少調用時間的服務器,進行請求)
一致性hash算法:ConsistentHash LoadBalance(比如請求帶了一個id=1,1進行hash算法獲得一個值,通過這個值,來選擇服務器進行請求)
dubbo默認基于隨機(基于權重)負載均衡機制,
可以默認指定?@Service(version = "0.0.1",weight = 100)
可以動態的進行權重加減
?
?
?
1.13 服務降級和容錯
一個服務器需要來處理需要的服務請求,有一些請求不是很重要重要,但是依然需要服務器耗費資源來處理請求,此時的其他請求處理就很慢,此時如果大量請求來調用一些重要服務,我們就需要關閉某些不重要的服務,來減少服務器壓力。
我們可以屏蔽功能:屏蔽(恢復)消費者調用服務提供者,請求不會到達服務器,服務器不會處理請求,減少服務器壓力
我們可以容錯功能:請求會到提供者,當提供者處理請求出錯了,直接返回null,消費者不拋出異常
1.14 集群容錯模式
簡單實用可以參考:http://dubbo.apache.org/zh-cn/docs/user/demos/fault-tolerent-strategy.html
實際開發需要整合hystrix
使用方法1:(測試過程中會發生容錯時而容錯不起作用,發送大量請求,某幾次依然會報錯(后來發現在fallback方法中出現的錯誤))
1、在提供者配置
使用@HystrixCommand注解方法,并在啟動類上加上注解?@EnableHystrix,但是實際測試過程過不需要這些配置
@HystrixCommand@Overridepublic String providerMethod(){System.out.println("提供服務成功");return "0.0.1";}2、消費者配置,并在啟動類上加上@EnableHystrix
@HystrixCommand(fallbackMethod = "testfallback")@Overridepublic String test() {String s = providerService.providerMethod();return s;}public String testfallback() {System.out.println("testfallback");return "錯誤了....";}使用方法2:(測試過程中正常)
消費者不用任何配置
提供者配置?@HystrixCommand,并在啟動類上加上@EnableHystrix
@HystrixCommand(fallbackMethod = "providerMethodFallback")@Overridepublic String providerMethod() {System.out.println("消費者提供服務成功2");if(Math.random()>0.5){System.out.println(">0.5");int a = 1/0;}return "0.0.2";}public String providerMethodFallback(){System.out.println("提供者出錯了....");return "提供者出錯了....";}
?
轉載于:https://www.cnblogs.com/yanxiaoge/p/11441010.html
總結
以上是生活随笔為你收集整理的Spring Boot----Dubbo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Latex】教你如何在word中像La
- 下一篇: 韩师师范学院计算机科学与技术在哪个学区,