以前的幾篇文章把dubbo服務層都介紹完畢,本篇文章我們主要寫web層如何調用服務層的方法。文章底部附帶源碼。java
啓動服務git
服務啓動時,會向zk註冊本身提供的服務,zk則會記錄服務提供者的IP地址以及暴露的接口名稱,經過zkCli.cmd 查看樹形結構,具體命令以下:github
一、ls / web
展現兩個目錄:dubbo、zookeeper,下面主要看一下dubbo目錄spring
二、ls /dubboapache
能夠看到註冊到dubbo目錄下的接口了api
三、ls /dubbo/com.example.dubbo.demo.api.DemoApi瀏覽器
服務提供者的具體信息就在providers目錄裏了springboot
服務消費者-web層app
該層依賴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