SpringBoot中集成Dubbo
項目地址
https://github.com/xunyegege/Backend_development/tree/master/dubbo
項目搭建問題需要注意版本:
springboot是1.5.9版本
dubbo依賴在下方
1.前提準備
架構設計(生產者+註冊中心+消費者)
2.註冊中心配置運行
1.Zookeeper
zookeeper是Hadoop的開源子項目(Google Chubby的開源實現),它是一個針對大型分佈式系統的可靠協調系統。
2.Zookeeper下載配置
①conf/ 中改zoo_sample.cfg 爲zoo.cfg
②啓動命令 ./bin/zkServer.sh start 關閉 …stop
3.可視化界面 dubbo-admin
dubbo-admin:就是zookeeper的可視化管理工具
https://github.com/apache/dubbo-admin/tree/master 下載後編譯運行
3.項目搭建之包結構設計
三個子模塊都是SpringBoot項目
4.公共Common模塊
寫接口方法與實體類
//實體類 需要序列化 public class HelloModel implements Serializable { private static final long serialVersionUID = 1392165405018286312L; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
//接口 public interface HelloService { HelloModel sayHello(); }
5.生產者Provider模塊
1.添加依賴
<!--dubbo--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.1.0</version> </dependency> <!-- 實現了註冊的功能 向zookeeper註冊功能--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <!--這邊引入的是公共模塊 ,詳見公共模塊的信息--> <dependency> <groupId>com.gavin</groupId> <artifactId>common</artifactId> <version>1.0.0-SNAPSHOT</version> <scope>compile</scope> </dependency>
2.添加配置
server.port=9003 dubbo.application.name=dubbo-provider dubbo.registry.address=zookeeper://127.0.0.1:2181 #把service包掃描進dubbo dubbo.scan.base-packages=com.gavin.provider.service #向註冊中心暴露的端口 -1是隨機 dubbo.protocol.port=-1
3.編寫接口實現類
import com.alibaba.dubbo.config.annotation.Service; import com.gavin.common.model.HelloModel; import com.gavin.common.service.HelloService; //這個@service註解是dubbo的,不要導入錯了 @Service public class HelloServiceImpl implements HelloService { @Override public HelloModel sayHello() { HelloModel model = new HelloModel(); model.setName("hello-dubbo"); return model; } }
4.包結構
6.消費者Consumer模塊
1.添加依賴
同生產者一致
2.添加配置
server.port=9004 dubbo.application.name=dubbo-consumer dubbo.registry.address=zookeeper://127.0.0.1:2181 //把controller包掃描進dubbo dubbo.scan.base-packages=com.gavin.consumer.controller
3.編寫controller方法
@RestController @RequestMapping(value = "/v1") public class TestController { //這個也是dubbo的包下面的 @Reference private HelloService helloService; @GetMapping(value = "/say") public HelloModel say() { return helloService.sayHello(); } }
4.包結構
7.項目運行&效果展示
先運行provider模塊
再運行consumer模塊
8.Dubbo-Admin管理平臺的使用
①容錯/屏蔽
屏蔽指的是,訪問的話,直接返回一個設定好的數據(默認是null)
容錯指的是,在生產者宕機情況下,返回設定好的數據(默認是null),如果生產者沒問題,則正常返回數據
相關配置:
在動態配置菜單內修改配置,設定想要返回的數據,如果是json,其key需要是實體類的某個屬性名(如name屬性)
!!!需要在consumer中加fastjson的依賴⭐️
②負載均衡
負載均衡指的是在集羣環境下讓請求在各個服務器間平衡
有幾種算法,隨機/輪詢/最少併發(默認是隨機算法)
需要多個生產者provider模塊
權重是會根據負載大小變化的,如果負載一直增加,那麼權重就會一直減少到不是最大,也就不會再分配任務給它了,反而分配給新的權重最大的服務器。
9.面試知識點補充
說一下這兩個的區別
@Autowired
@Resource
@Autowired爲Spring提供的註解,需要導入包org.springframework.beans.factory.annotation.Autowired。
@Autowired採取的策略爲按照類型注入。
public class UserService {
@Autowired
private UserDao userDao;
}
如上代碼所示,這樣裝配回去spring容器中找到類型爲UserDao的類,然後將其注入進來。這樣會產生一個問題,當一個類型有多個bean值的時候,會造成無法選擇具體注入哪一個的情況,這個時候我們需要配合着@Qualifier使用。
@Qualifier告訴spring具體去裝配哪個對象。
public class UserService {
@Autowired
@Qualifier(name="userDao1")
private UserDao userDao;
}
這個時候我們就可以通過類型和名稱定位到我們想注入的對象。
@Resource註解由J2EE提供,需要導入包javax.annotation.Resource。
@Resource默認按照ByName自動注入。
public class UserService {
@Resource
private UserDao userDao;
@Resource(name="studentDao")
private StudentDao studentDao;
@Resource(type="TeacherDao")
private TeacherDao teacherDao;
@Resource(name="manDao",type="ManDao")
private ManDao manDao;
}
①如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常。
②如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常。
③如果指定了type,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個,都會拋出異常。
④如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配,如果匹配則自動裝配。
總結
Spring屬於第三方的,J2EE是Java自己的東西。使用@Resource可以減少代碼和Spring之間的耦合。
閒聊時刻
10年短信公司,互聯網100強企業!主營業務:短信(國內和國際)App H5一鍵免密登錄,防薅羊毛接口,圖片OCR,空號檢測,活躍號檢測,人證覈驗,活體檢測,高防ddos攻擊等等200多個企業服務接口!需要的聯繫他13592366783 官方鏈接:https://zz.253.com/v5.html#/register?uid=1953
自己公司需求 偶然間 用了一家第三方接口供應商,產品應有盡有,很齊全,對接文檔非常詳細,彼此都很節約時間,主要非常穩定,包括服務方面很給力,有興趣的博友,可以聯繫他,算是對合作夥伴的支持了