分佈式微服務專欄005(springboot集成Dubbo)

SpringBoot中集成Dubbo

項目地址

https://github.com/xunyegege/Backend_development/tree/master/dubbo

項目搭建問題需要注意版本:

springboot是1.5.9版本

dubbo依賴在下方


1.前提準備

架構設計(生產者+註冊中心+消費者)

image-20190926152728397

image-20190926152703406

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.項目搭建之包結構設計

image-20190926153709591

三個子模塊都是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.包結構

image-20190926161236121

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.包結構

image-20190926161347399

7.項目運行&效果展示

先運行provider模塊

再運行consumer模塊

image-20190926161605857

image-20190926161622839

8.Dubbo-Admin管理平臺的使用

①容錯/屏蔽

image-20190926184931549

屏蔽指的是,訪問的話,直接返回一個設定好的數據(默認是null)

容錯指的是,在生產者宕機情況下,返回設定好的數據(默認是null),如果生產者沒問題,則正常返回數據

相關配置:

image-20190926185143247

在動態配置菜單內修改配置,設定想要返回的數據,如果是json,其key需要是實體類的某個屬性名(如name屬性)

!!!需要在consumer中加fastjson的依賴⭐️

②負載均衡

image-20190926185352903

負載均衡指的是在集羣環境下讓請求在各個服務器間平衡

有幾種算法,隨機/輪詢/最少併發(默認是隨機算法)

image-20190926185536955

需要多個生產者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

自己公司需求 偶然間 用了一家第三方接口供應商,產品應有盡有,很齊全,對接文檔非常詳細,彼此都很節約時間,主要非常穩定,包括服務方面很給力,有興趣的博友,可以聯繫他,算是對合作夥伴的支持了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章