Dubbo 02: 直連式
直連式
-
需要用到兩個相互獨立的maven的web項目
項目1:o1-link-userservice-provider 作為服務的提供者 項目2:o2-link-consumer 作為使用服務的消費者
項目1
-
結構
-
pom文件
<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.dubbo</groupId> <artifactId>o1-link-userservice-provider</artifactId> <packaging>war</packaging> <version>1.0.0</version> <dependencies> <!--Spring依賴--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.16.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.16.RELEASE</version> </dependency> <!--dubbo依賴--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> </dependencies> <build> <plugins> <!--JDK1.8編譯插件--> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
-
實體類:注意要實現序列化介面,數據需要通過socket網路傳輸
package com.example.dubbo.model; import java.io.Serializable; public class User implements Serializable { private String id; private String name; private String age; @Override public String toString() { return "User{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", age='" + age + '\'' + '}'; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public User(String id, String name, String age) { this.id = id; this.name = name; this.age = age; } public User() { } }
-
服務介面
package com.example.dubbo.service; import com.example.dubbo.model.User; public interface UserService { /** * 根據用戶id,獲取用資訊 */ User queryUserById(String id); }
-
服務介面的實現類
package com.example.dubbo.service.impl; import com.example.dubbo.model.User; import com.example.dubbo.service.UserService; public class UserServiceImpl implements UserService { /** * 根據用戶id,獲取用戶資訊 */ @Override public User queryUserById(String id) { User user = new User(); user.setId(id); user.setName("橘子"); user.setAge("21"); return user; } }
-
dubbo框架里的服務提供者所對應的配置文件:dubbo-link-userservice-provider.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="//dubbo.apache.org/schema/dubbo" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //dubbo.apache.org/schema/dubbo //dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 對外提供的服務的名稱,要具有唯一性--> <dubbo:application name="o1-link-userservice-provider"/> <!-- 服務使用的協議以及埠號 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- 服務對外提供的介面 --> <dubbo:service interface="com.example.dubbo.service.UserService" ref="userService" registry="N/A"/> <!-- 對外提供的介面的實現類--> <bean id="userService" class="com.example.dubbo.service.impl.UserServiceImpl"/> </beans>
-
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="//xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//xmlns.jcp.org/xml/ns/javaee //xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 將dubbo框架交給spring框架管理 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:dubbo-link-userservice-provider.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
注意
-
由於採用的是直連方式,要把項目1,打成jar包,後面項目2會引用這個jar包
-
項目1打成jar包的步驟
1.將項目1的pom文件中的<packaging>war</packaging>注釋掉,這樣打包的時候默認會打成jar包 2.點擊maven項目管理中的項目1的Lifecycle里的install(操作見下圖) 3.把注釋放開
項目2
-
結構
-
pom文件:其中要根據項目1的坐標將之前把項目1打成的jar包引入項目2中使用
<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.dubbo</groupId> <artifactId>o2-link-consumer</artifactId> <packaging>war</packaging> <version>1.0.0</version> <dependencies> <!--Spring依賴--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.16.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.16.RELEASE</version> </dependency> <!--dubbo依賴--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!-- 對01-link-userservice-provider項目的依賴--> <dependency> <groupId>com.example.dubbo</groupId> <artifactId>o1-link-userservice-provider</artifactId> <version>1.0.0</version> </dependency> </dependencies> <build> <plugins> <!--JDK1.8編譯插件--> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
-
dubbo框架里的消費者所對應的配置文件:dubbo-link-consumer.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="//dubbo.apache.org/schema/dubbo" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //dubbo.apache.org/schema/dubbo //dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 消費者的唯一標識--> <dubbo:application name="o2-link-consumer"/> <!-- 引用的遠程服務的相關資訊 --> <dubbo:reference id="userService" interface="com.example.dubbo.service.UserService" url="dubbo://127.0.0.1:20880" registry="N/A"/> </beans>
-
spring核心配置文件:application.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:context="//www.springframework.org/schema/context" xmlns:mvc="//www.springframework.org/schema/mvc" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context.xsd //www.springframework.org/schema/mvc //www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 掃描控制層 --> <context:component-scan base-package="com.example.dubbo.web.controller"/> <!-- 配置註解驅動 --> <mvc:annotation-driven/> <!-- 配置視圖解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
-
Controller層
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @Autowired UserService userService; /** * 接收前端請求,查詢數據並返回 */ @RequestMapping("/getUser.do") public String getUser(String id, Model model){ //獲取數據 User user = userService.queryUserById(id); //存放數據 model.addAttribute("user", user); //返回到用戶詳情頁面 return "userDetail"; } }
-
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="//xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//xmlns.jcp.org/xml/ns/javaee //xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application.xml, classpath:dubbo-link-consumer.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
-
返回給前端的用戶詳情頁面:userDetail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用戶詳情頁面</title> </head> <body> <div>用戶標識:${user.id}</div> <div>用戶名稱:${user.name}</div> <div>用戶年齡:${user.age}</div> </body> </html>
測試
-
將項目1(服務提供者)和項目2(消費者),分別部署到tomcat伺服器上並啟動伺服器
-
從消費者端去訪問獲取服務
直連缺點
- 由於事先要把項目1打成jar包,項目2中依賴項目1的jar包,上述方式雖然實現了消費者對服務的訪問,但是上述直連方式並沒有實現服務提供者和消費者的真正分離,業務還是耦合在一個項目中(這裡是耦合在項目2里)