spring/springboot整合dubbo详细教程

目录一、基本使用二、spring整合dubbo2.1 spring-common模块:2.2spring-user模块:2.3spring-order模块:2.4效果三、springboot整合dubbo3.1boot-common模块:3.2 boot-user模块:3.3 boot-order模块:3.4 效果

一、基本使用

需求:

某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;我们现在需要创建两个服务模块进行测试

模块 功能 订单服务web模块 创建订单等 用户服务service模块 查询用户地址等

测试预期结果:订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。

二、spring整合dubbo

以下使用XML 配置的方式,更多配置方式见官方文档

2.1 spring-common模块:

公共接口层(model,service,exception…),定义公共接口,也可以导入公共依赖

UserAddress.java:用户地址实体类

public class UserAddress implements Serializable {    private Integer id;    private String userAddress;    private String userId;    private String consignee;    private String phoneNum;    private String isDefault;....}

IOrderService.java:订单接口

public interface IOrderService {    /**     * 用户下单     * @param userId     */    UserAddress placeOrder(int userId);}

IUserService.java:用户接口

public interface IUserService {    /**     * 根据用户id获取用户地址     * @param userId     * @return     */    UserAddress getUserAddById(int userId);}

pom.xml:通用的依赖,引入dubbo和zkclient

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>dubboStudy</artifactId>        <groupId>org.example</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>spring-common</artifactId>    <properties>        <maven.compiler.source>8</maven.compiler.source>        <maven.compiler.target>8</maven.compiler.target>    </properties>    <dependencies>        <!--dubbo -->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>dubbo</artifactId>            <version>2.5.10</version>        </dependency>        <!--zookeeper -->        <dependency>            <groupId>org.apache.zookeeper</groupId>            <artifactId>zookeeper</artifactId>            <version>3.4.6</version>        </dependency>        <dependency>            <groupId>com.github.sgroschupf</groupId>            <artifactId>zkclient</artifactId>            <version>0.1</version>        </dependency>    </dependencies></project>

2.2spring-user模块:

用户业务,作为服务提供者

pom.xml:引入通用模块,可以使用定义的接口

<dependency>  <groupId>org.example</groupId>  <artifactId>spring-common</artifactId>  <version>1.0-SNAPSHOT</version></dependency>

UserServiceImpl.xml:IUserService的实现类,供远程调用

public class UserServiceImpl implements IUserService {    @Override    public UserAddress getUserAddById(int userId) {        UserAddress userAddress = new UserAddress();        userAddress.setUserAddress("上海市宝山区");        return userAddress;    }}

provider.xml:dubbo配置信息

<?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://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">    <!--1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名)-->    <dubbo:application name="spring-user"/>    <!--2、指定注册中心的位置-->    <!--<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>-->    <dubbo:registry address="zookeeper://192.168.31.136:2181"/>    <!--3、指定通信规则(通信协议? 服务端口)-->    <dubbo:protocol name="dubbo" port="20880"/>    <!--4、暴露服务 让别人调用 ref指向服务的真正实现对象-->    <bean id="userServiceImpl" class="me.nic.service.impl.UserServiceImpl"/>    <!--服务的实现-->    <dubbo:service interface="me.nic.service.IUserService" ref="userServiceImpl"/></beans>

ConsumerRun.java:启动:

public class ConsumerRun {    public static void main(String[] args) throws IOException {        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");        IOrderService orderService = applicationContext.getBean(IOrderService.class);        orderService.placeOrder(1);        System.in.read();    }}

2.3spring-order模块:

订单业务,作为服务消费者

pom.xml:引入通用模块,可以使用定义的接口,同1.2OrderServiceImpl.xml:IOrderService的实现类,其中远程调用userService

@Servicepublic class OrderServiceImpl implements IOrderService {    @Autowired    private IUserService userService;    @Override    public UserAddress placeOrder(int userId) {        // 远程调用,获取用户地址        UserAddress userAddById = userService.getUserAddById(userId);        // 下单        System.out.println("用户地址:" + userAddById.getUserAddress());        System.out.println("下单成功");        return null;    }}

consumer.xml:dubbo配置信息

<?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:context="http://www.springframework.org/schema/context"       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">    <!--包扫描-->    <context:component-scan base-package="me.nic.service.impl"/>    <!--指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名)-->    <dubbo:application name="spring-order"/>    <!--指定注册中心的位置-->    <dubbo:registry address="zookeeper://192.168.31.136:2181"/>    <!--调用远程暴露的服务,生成远程服务代理-->    <dubbo:reference id="userService" interface="me.nic.service.IUserService"/></beans>

ProviderRun.java:启动

public class ProviderRun {    public static void main(String[] args) throws IOException {        ClassPathXmlApplicationContext context =                new ClassPathXmlApplicationContext("classpath:provider.xml");        System.in.read();    }}

2.4效果

ProviderRun启动之后阻塞,ConsumerRun启动之后调用orderService.placeOrder(1)placeOrder中远程调用spring-user模块中的userService.getUserAddById(userId)获取用户地址:

用户地址:上海市宝山区下单成功

三、springboot整合dubbo

3.1boot-common模块:

公共接口层(model,service,exception…),定义公共接口,也可以导入公共依赖

UserAddress.java:用户地址实体类

public class UserAddress implements Serializable {    private Integer id;    private String userAddress;    private String userId;    private String consignee;    private String phoneNum;    private String isDefault;....}

IOrderService.java:订单接口

public interface IOrderService {    /**     * 用户下单     * @param userId     */    UserAddress placeOrder(int userId);}

IUserService.java:用户接口

public interface IUserService {    /**     * 根据用户id获取用户地址     * @param userId     * @return     */    UserAddress getUserAddById(int userId);}

pom.xml:通用的依赖,引入dubbo的starter

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.5.0</version>        <relativePath/>     </parent>        <groupId>com.example</groupId>    <artifactId>boot-common</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>boot-common</name>        <properties>        <java.version>1.8</java.version>    </properties>        <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba.boot</groupId>            <artifactId>dubbo-spring-boot-starter</artifactId>            <version>0.2.0</version>        </dependency>    </dependencies></project>

3.2 boot-user模块:

用户业务,作为服务提供者

pom.xml:引入通用模块,可以使用定义的接口

<dependency>  <groupId>org.example</groupId>  <artifactId>spring-common</artifactId>  <version>1.0-SNAPSHOT</version></dependency>

UserServiceImpl.xml:IUserService的实现类,供远程调用@Service 暴露dubbo的服务

@Service@Componentpublic class UserServiceImpl implements IUserService {    @Override    public UserAddress getUserAddById(int userId) {        UserAddress userAddress = new UserAddress();        userAddress.setUserAddress("上海市宝山区");        return userAddress;    }}

application.properties:dubbo配置信息

dubbo.application.name=boot-userdubbo.registry.address=192.168.31.136:2181dubbo.registry.protocol=zookeeperdubbo.protocol.name=dubbodubbo.protocol.port=20880

BootUserApplication.java:启动:@EnableDubbo : 开启基于注解的dubbo功能

@EnableDubbo@SpringBootApplicationpublic class BootUserApplication {    public static void main(String[] args) {        SpringApplication.run(BootUserApplication.class, args);    }}

3.3 boot-order模块:

订单业务,作为服务消费者

pom.xml:引入通用模块,可以使用定义的接口,同1.2

<dependency>  <groupId>com.example</groupId>  <artifactId>boot-common</artifactId>  <version>0.0.1-SNAPSHOT</version></dependency><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-web</artifactId></dependency>

OrderServiceImpl.xml:IOrderService的实现类,其中远程调用userService@Reference:引用远程提供者服务

@Servicepublic class OrderServiceImpl implements IOrderService {    //引用远程提供者服务    @Reference    private IUserService userService;    @Override    public UserAddress placeOrder(int userId) {        // 远程调用,获取用户地址        UserAddress userAddById = userService.getUserAddById(userId);        return userAddById;    }}

OrderController.java:web接口,调用OrderService:

@Controllerpublic class OrderController {    @Autowired    IOrderService orderService;    @RequestMapping("/initOrder")    @ResponseBody    public UserAddress initOrder(@RequestParam("uid")int userId) {        return orderService.placeOrder(userId);    }}

application.properties:dubbo配置信息

server.port=8081dubbo.application.name=boot-orderdubbo.registry.address=zookeeper://192.168.31.136:2181

BootOrderApplication.java:启动

@EnableDubbo@SpringBootApplicationpublic class BootOrderApplication {    public static void main(String[] args) {        SpringApplication.run(BootOrderApplication.class, args);    }}

3.4 效果

到此这篇关于springboot整合dubbo详细教程的文章就介绍到这了,更多相关springboot整合dubbo内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

山不厌高,水不厌深。

spring/springboot整合dubbo详细教程

相关文章:

你感兴趣的文章:

标签云: