springboot+mybatis+dubbo+aop日誌終結篇
之前的幾篇文章把dubbo服務層都介紹完畢,本篇文章咱們主要寫web層如何呼叫服務層的方法。文章底部附帶原始碼。
啟動服務
服務啟動時,會向zk註冊自己提供的服務,zk則會記錄服務提供者的IP地址以及暴露的介面名稱,通過zkCli.cmd 檢視樹形結構,具體命令如下:
1、ls /
展示兩個目錄:dubbo、zookeeper,下面主要看一下dubbo目錄
2、ls /dubbo
可以看到註冊到dubbo目錄下的介面了
3、ls /dubbo/com.example.dubbo.demo.api.DemoApi
服務提供者的具體資訊就在providers目錄裡了
服務消費者-web層
該層依賴api、model層,呼叫服務提供者對外提供的服務,因此需要配置服務消費者的dubbo資訊,主要使用到的dubbo標籤如下:
dubbo:application、dubbo:registry、dubbo:reference,具體配置資訊如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation=" http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 定義了提供方應用資訊,用於計算依賴關係;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字 --> <dubbo:application name="${my.dubbo.application.name}" owner="ll" organization="ll"/> <!-- 使用 zookeeper 註冊中心暴露服務,注意要先開啟 zookeeper--> <dubbo:registry id="zookeeper-registry" protocol="${my.dubbo.registry.protocol}" address="${my.dubbo.registry.address}" /> <dubbo:monitor protocol="registry"/> <!-- 生成遠端服務代理,可以和本地bean一樣使用demoService --> <dubbo:reference id="demoApi" interface="com.example.dubbo.demo.api.DemoApi" check="false" /> </beans>
dubbo:registry的配置需要跟服務提供者的配置是一致的。
dubbo:reference配置引用服務的介面名稱,詳細的屬性參考dubbo官方文件。
maven依賴
<dependency> <groupId>com.example.dubbo</groupId> <artifactId>dubbo-demo-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.example.dubbo</groupId> <artifactId>dubbo-demo-model</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
服務呼叫
新建一個DemoService來呼叫服務提供者對外暴露的方法
package com.example.dubbo.demo.web.service; import com.example.dubbo.demo.api.DemoApi; import dubbo.demo.model.entity.Student; import java.util.List; import org.apache.dubbo.config.annotation.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * 消費者服務層 * * @author chenlong * @date 2019-03-24 00:49 * @since 1.0.0 */ @Service public class DemoService { private static final Logger LOGGER = LoggerFactory.getLogger(DemoService.class); @Autowired private DemoApi demoApi; public String sayHello(String name) { return demoApi.sayHello(name); } public List<Student> getAll(){ return demoApi.getAll(); } public void add(Student student){ demoApi.add(student); } }
新建一個DemoController來進行測試
package com.example.dubbo.demo.web.controller; import com.example.dubbo.demo.web.service.DemoService; import dubbo.demo.model.entity.Student; import java.util.List; import java.util.Random; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * demo 控制器 * * @author chenlong * @date 2019-03-24 00:51 * @since 1.0.0 */ @RestController @RequestMapping("/demo") public class DemoController { private static Logger logger = LoggerFactory.getLogger(DemoController.class); @Autowired private DemoService demoService; /** * 測試方法,瀏覽器訪問 /demo/index 可以看到響應結果了 * * @return */ @RequestMapping(value = "/index", method = RequestMethod.GET) @ResponseBody public String index() { return demoService.sayHello("dubbo"); } @GetMapping("all") @ResponseBody public List<Student> getAll(){ return demoService.getAll(); } @GetMapping("add") @ResponseBody public Student add(){ Student student = new Student(); student.setNum("2019"+ new Random().nextInt()); student.setName("喬治"+new Random().nextInt(100)); student.setAge(new Random().nextInt(10)); student.setSex("m"); demoService.add(student); return student; } }
啟動web層,web層會以長連線的方式監聽zk,同時會把zk上的服務提供者的資訊拿到本地,這樣當zk掛掉後不影響消費者的呼叫,當新的服務註冊到zk上時,消費者會同時拿到新的服務資訊。
我們在瀏覽器中輸入地址,發現呼叫成功
程式碼地址: https://github.com/lcchenlong/springbootdubbo
作者:Eric.Chen
出處: https://www.cnblogs.com/lc-chenlong
如果喜歡作者的文章,請關注“寫程式碼的猿”訂閱號以便第一時間獲得最新內容。本文版權歸作者所有,歡迎轉載