版本号:每个接口都应定义版本号,为后续不兼容升级提供可能。当一个接口有不同的实现,项目早 期使用的一个实现类, 之后创建接口的新的实现类。区分不同的接口实现使用 version。 特别是项目需要把早期接口的实现全部换位新的实现类,也需要使用 version.
完整项目
1.创建一个java工程 (编写实体类【要序列化】和接口)
package com.bjpowernode.dubbo.model;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
接口
public interface UserService { /*根据用户标识获取用户信息*/ User queryUserById(Integer id,String name); }
2. 创建一个maven web工程 :服务的提供者
2.1修改pom文件 添加spring依赖 和Dubbo依赖 和接口工程依赖 注册中心 jdk编译级别
<!--spring依赖--> <dependencies> <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> <!--接口工程--> <dependency> <groupId>com.bjpowernode</groupId> <artifactId>006-zk-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--注册中心--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.1.0</version> </dependency> </dependencies>
2.2实现服务接口:UserServiceImpl
public class UserServiceImpl implements UserService { public User queryUserById(Integer id, String name) { User user=new User(); user.setId(id); user.setName(name+"--1"); return user; } }
public class UserServiceImpl2 implements UserService { public User queryUserById(Integer id, String name) { User user=new User(); user.setId(id); user.setName(name+"--2"); return user; } }
2.3配置dubbo服务提供者的核心配置文件 dubbo-userservice-provider.xml
<!--声明dubbo服务提供者名称:保证唯一性--> <dubbo:application name="009-zk-userservice-multi-provider"/> <!--声明dubbo的协议和端口号--> <dubbo:protocol name="dubbo" port="20880"/> <!--使用注册中心--> <!--<dubbo:registry address="zookeeper://192.168.204.128:2181"/>--> <dubbo:registry address="zookeeper://localhost:2181"/> <!--暴露服务接口 不管是否一个接口有多个实现类 只要服务提供者接口服务的时候指定了 版本号 那么消费者引用远程接口服务的时候 就必须指定版本号--> <dubbo:service interface="com.bjpowernode.dubbo.service.UserService" ref="userServiceImpl" version="1.0.0"/> <dubbo:service interface="com.bjpowernode.dubbo.service.UserService" ref="userServiceImpl2" version="2.0.0"/> <!--将接口的实现类加载到spring容器中--> <bean id="userServiceImpl" class="com.bjpowernode.dubbo.service.impl.UserServiceImpl"/> <bean id="userServiceImpl2" class="com.bjpowernode.dubbo.service.impl.UserServiceImpl2"/>
2.4 添加监听器,加载配置文件
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:dubbo-userservice-multi-provider.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
3.创建一个maven web工程:服务消费者 link-consumer
3.1配置pom文件:添加需要的依赖(spring,dubbo,接口工程 注册中心)jdk编译级别
3.2 设置dubbo的核心文件(dubbo-consumer.xml)
<dubbo:application name="010-zk-multi-consumer"/> <!--<dubbo:registry address="zookeeper://192.168.204.128:2181"/>--> <dubbo:registry address="zookeeper://localhost:2181"/> <!--引用远程接口服务--> <dubbo:reference id="userService" interface="com.bjpowernode.dubbo.service.UserService" version="1.0.0"/> <dubbo:reference id="userService2" interface="com.bjpowernode.dubbo.service.UserService" version="2.0.0"/>
3.3applicationContext.xml
扫描插件和视图解析器
<!--扫描组件--> <context:component-scan base-package="com.bjpowernode.dubbo.web"></context:component-scan> <!--配置注解驱动--> <mvc:annotation-driven></mvc:annotation-driven> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean>
3.4编写controller
@Controller public class UserController { @Autowired private UserService userService; @Autowired private UserService userService2; @RequestMapping("/userDetail") public String userDetail(Model model,Integer id,String name){ User user = userService.queryUserById(id, name); User user2 = userService2.queryUserById(id, name); model.addAttribute("user",user); model.addAttribute("user2",user2); return "userDetail"; } }
3.5 配置中央调度器(就是一个servlet:DispatcherServlet)
<!--中央调度器--> <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:applicationContext.xml,classpath:dubbo-multi-consumer.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
3.6 jsp页面 user
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用户详情</title> </head> <body> <h3>用户1 ---- </h3> <div>用户标识:${user.id}</div> <div>用户姓名:${user.name}</div> <hr> <h3>用户1 ---- </h3> <div>用户标识:${user2.id}</div> <div>用户姓名:${user2.name}</div> </body> </html>
Detail.jsp
启动服务测试
springboot 集成Dubbo
1.创建java接口实体类
2.服务提供者 创建springboot项目
2.1添加依赖
<!-- 接口工程项目的gav--> <dependency> <groupId>org.example</groupId> <artifactId>022-interface-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--dubbo依赖--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <!--zookeeper依赖--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>2.7.8</version> <type>pom</type> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
2.2实现接口实现类
/*使用dubbo中注解暴露服务*/ /*@Component*/ @DubboService(interfaceClass = StudentService.class,version = "1.0" ,timeout = 5000) public class StudentServiceImpl implements StudentService { @Override public Student queryStudent(Integer id) { Student student=new Student(); if (1001==id){ student.setId(id); student.setName(id+"--"+"张三"); student.setAge(20); }else if (1002==id){ student.setId(id); student.setName(id+"--"+"李四"); student.setAge(30); } return student; } }
2.3配置application.properties
#配置服务名称 spring.application.name=studentservice-provider #配置扫描的包 扫描的@DubboService dubbo.scan.base-packages=com.bjpowernode.service #配置dubbo协议 #dubbo.protocol.name=dubbo #dubbo.protocol.port=20880 #注册中心 dubbo.registry.address=zookeeper://localhost:2181
3.服务消费者
3.1pom文件添加依赖
<!--web起步依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--公告项目的gav--> <dependency> <groupId>org.example</groupId> <artifactId>022-interface-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--dubbo依赖--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <!--zookeeper依赖--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>2.7.8</version> <type>pom</type> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
3.2 配置application.properties
#z指定服务名称 spring.application.name=consumer-application #指定注册中心 dubbo.registry.address=zookeeper://localhost:2181
3.3编写controller层 (pom文件要添加web起步依赖)
@RestController public class DubboController { /* 引用远程服务,把创建好的代理对象 注入给studentService * */ @DubboReference(interfaceClass = StudentService.class,version ="1.0") private StudentService studentService; @GetMapping("/query") public String queryStudent(){ Student student = studentService.queryStudent(1001); return "调用远程接口,获取对象:"+student; } }
最后测试 编译主测试方法