精华内容
下载资源
问答
  • ![图片说明](https://img-ask.csdn.net/upload/201811/14/1542167689_177551.png)@Reference PublicUserLoginService publicUserLoginService; ![图片说明]...
  • dubbo提供者和消费者工程
  • dubbo提供者和消费者示例
  • Dubbo 提供者和消费者

    千次阅读 2019-06-04 11:18:41
    一、说明 Dubbo官方建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型异常也是 API 的一部分,这样做也符合分包原则:...gmall-user-provider : 服务提供者(提供获取用户地址的服务) gmall-or...

    一、说明

    Dubbo官方建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。
    我们的演示项目分为3个:

    • gmall-common : 放置共用的服务接口、实体对象、工具类等等。
    • gmall-user-provider : 服务提供者(提供获取用户地址的服务)
    • gmall-order-consumer : 服务消费者

    二、创建公共依赖项目 (gmall-common)

    我们把 服务消费者 和 服务消费者 都需要的服务的接口层放入这个项目中。

    1. 创建maven项目 gmall-common

    2. UserAddress 实体类

    package com.gf.entity;
    
    
    import java.io.Serializable;
    
    public class UserAddress implements Serializable{
    
        private static final long serialVersionUID = -1220870792073689661L;
    
        private Integer id;
        private String userAddress;
        private String userId;
        private String consignee;
        private String isDefault;
    
        public UserAddress(Integer id, String userAddress, String userId, String consignee, String isDefault) {
            this.id = id;
            this.userAddress = userAddress;
            this.userId = userId;
            this.consignee = consignee;
            this.isDefault = isDefault;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUserAddress() {
            return userAddress;
        }
    
        public void setUserAddress(String userAddress) {
            this.userAddress = userAddress;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        public String getConsignee() {
            return consignee;
        }
    
        public void setConsignee(String consignee) {
            this.consignee = consignee;
        }
    
        public String getIsDefault() {
            return isDefault;
        }
    
        public void setIsDefault(String isDefault) {
            this.isDefault = isDefault;
        }
    
        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder( "{\"UserAddress\":{" );
            sb.append( "\"id\":" )
                    .append( id );
            sb.append( ",\"userAddress\":\"" )
                    .append( userAddress ).append( '\"' );
            sb.append( ",\"userId\":\"" )
                    .append( userId ).append( '\"' );
            sb.append( ",\"consignee\":\"" )
                    .append( consignee ).append( '\"' );
            sb.append( ",\"isDefault\":\"" )
                    .append( isDefault ).append( '\"' );
            sb.append( "}}" );
            return sb.toString();
        }
    
    }
    
    

    3. UserService 接口

    package com.gf.service;
    
    
    import com.gf.entity.UserAddress;
    
    import java.util.List;
    
    public interface UserService {
    
        List<UserAddress> getUserAddressList(String userId);
    
    }
    
    

    三、创建服务提供者 (gmall-user-provider)

    1. pom.xml

    目前,dubbo-spring-boot-starter 发布,将为Spring Boot 2.x和1.x分离两个版本:

    • 0.2.x 是Spring Boot 2.x的主流发行版

    • 0.1.x 是用于维护Spring Boot 1.x的旧版本

    因为我们是整合SpringBoot2.X,所以我们引入0.2.0 的 dubbo-spring-boot-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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.gf</groupId>
        <artifactId>gmall-user-provider</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>gmall-user-provider</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- 引入dubbo依赖 -->
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>0.2.0</version>
            </dependency>
    		 <!-- 公共类依赖 -->
            <dependency>
                <groupId>com.gf</groupId>
                <artifactId>gmall-common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    
    

    2. application.properties

    #就是服务名,不能跟别的dubbo提供端重复
    dubbo.application.name=gmall-user-provider
    
    #是指定注册中心协议
    dubbo.registry.protocol=zookeeper
    
    #注册中心的地址加端口号
    dubbo.registry.address=127.0.0.1:2181
    
    #注解方式要扫描的包
    
    dubbo.scan.base-package=com.gf
    
    #是分布式固定是dubbo,不要改
    dubbo.protocol.name=dubbo
    
    #服务暴露端口
    dubbo.protocol.port=20880
    
    #表示从注册中心发现监控中心地址
    dubbo.monitor.protocol=registry
    

    3. UserServiceImpl

    Dubbo 的 @Service 注解用于暴露服务, 因为与spring 的@Service 重名,为了区别,我们使用@Component 把这个类交给spring管理

    package com.gf.service.impl;
    
    
    import com.alibaba.dubbo.config.annotation.Service;
    import com.gf.entity.UserAddress;
    import com.gf.service.UserService;
    import org.springframework.stereotype.Component;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Service // com.alibaba.dubbo.config.annotation.Service
    @Component
    public class UserServiceImpl implements UserService{
    
    
        @Override
        public List<UserAddress> getUserAddressList(String userId) {
    
            List<UserAddress> list = new ArrayList<>();
            UserAddress address1 = new UserAddress(1 , "上海市杨浦区xxx路xxx号" , "1" , "王某某","0");
            UserAddress address2 = new UserAddress(2 , "上海市徐汇区xxx路xxx号" , "1" , "张某某","1");
    
            list.add( address1 );
            list.add( address2 );
    
            return list;
        }
    }
    
    

    4. 主启动类 UserServiceProviderApplication

    我们使用**@EnableDubbo** 开启基于注解的dubbo功能

    package com.gf;
    
    import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    //开启基于注解的dubbo功能
    @EnableDubbo
    @SpringBootApplication
    public class UserServiceProviderApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(UserServiceProviderApplication.class, args);
    	}
    }
    
    

    四、创建服务消费者 (gmall-order-consumer)

    1. pom.xml

    <?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">
    	<modelVersion>4.0.0</modelVersion>
    
    	<groupId>com.gf</groupId>
    	<artifactId>gmall-order-consumer</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<packaging>jar</packaging>
    
    	<name>gmall-order-consumer</name>
    	<description>Demo project for Spring Boot</description>
    
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.1.0.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter</artifactId>
    		</dependency>
    		<!-- 引入springboot的web依赖 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		<!-- 引入dubbo的依赖 -->
    		<dependency>
    			<groupId>com.alibaba.boot</groupId>
    			<artifactId>dubbo-spring-boot-starter</artifactId>
    			<version>0.2.0</version>
    		</dependency>
    		<!-- 公共类依赖 -->
    		<dependency>
    			<groupId>com.gf</groupId>
    			<artifactId>gmall-common</artifactId>
    			<version>1.0-SNAPSHOT</version>
    		</dependency>
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    
    </project>
    
    

    2. application.properties

    #项目运行端口
    server.port=8761
    
    #就是服务名,不能跟别的dubbo提供端重复
    dubbo.application.name=gmall-order-consumer
    
    #是指定注册中心协议、地址和端口
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    
    #表示从注册中心发现监控中心地址
    dubbo.monitor.protocol=registry
    

    3. OrderService

    package com.gf.service;
    
    
    import com.gf.entity.UserAddress;
    
    import java.util.List;
    
    public interface OrderService {
    
        List<UserAddress> initOrder(String userId);
    
    }
    
    

    4. OrderServiceImpl

    Dubbo 提供了 @Reference 注解 用来引用远程服务接口

    package com.gf.service.impl;
    
    import com.alibaba.dubbo.config.annotation.Reference;
    import com.gf.entity.UserAddress;
    import com.gf.service.OrderService;
    import com.gf.service.UserService;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class OrderServiceImpl implements OrderService {
    
        @Reference
        UserService userService;
    
    
        @Override
        public List<UserAddress> initOrder(String userId) {
            System.out.println( "用户id : " + userId );
            //查询用户地址
            List<UserAddress> addressList = userService.getUserAddressList( userId );
            return addressList;
        }
    }
    
    
    

    5. OrderController

    package com.gf.controller;
    
    import com.gf.entity.UserAddress;
    import com.gf.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    public class OrderController {
    
        @Autowired
        OrderService orderService;
    
        @RequestMapping("/initOrder")
        public List<UserAddress> initOrder(@RequestParam("userId") String userId) {
            return orderService.initOrder( userId );
        }
    
    
    }
    
    

    五、安装监控中心 dubbo-monitor-simple

    Dubbo为我们提供了一个简单的监控中心,dubbo-monitor-simple,上一章我们下载的运维相关的项目 incubator-dubbo-ops-master 中有个 dubbo-monitor-simple,我们通过

    mvn clean package
    

    来构建项目。
    构建完成后 我们可以看到有个 dubbo-monitor-simple-2.0.0-assembly.tar.gz 我们解压后,进入它的目录 conf 下有个 dubbo.properties

    dubbo.container=log4j,spring,registry,jetty-monitor
    dubbo.application.name=simple-monitor
    dubbo.application.owner=dubbo
    #dubbo.registry.address=multicast://224.5.6.7:1234
    #默认指定了使用zookeeper注册中心,端口也和我们使用的一样,所以不需要修改了
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    #dubbo.registry.address=redis://127.0.0.1:6379
    #dubbo.registry.address=dubbo://127.0.0.1:9090
    #服务暴露端口
    dubbo.protocol.port=7070
    #服务运行端口
    dubbo.jetty.port=8080
    dubbo.jetty.directory=${user.home}/monitor
    dubbo.charts.directory=${user.home}/monitor/charts
    dubbo.statistics.directory=${user.home}/monitor/statistics
    dubbo.log4j.file=logs/dubbo-monitor-simple.log
    dubbo.log4j.level=WARN
    

    我们进入assembly.bin 目录下执行启动命令:

    ./start.sh
    

    我们访问:http://127.0.0.1:8080/services.html

    因为我没并没有启动 服务提供者 和 服务消费者,所以这里监控到的服务只有 监控中心自己。

    六、项目测试

    我们分别启动服务提供者和服务消费者,然后我们打开我们上一章节搭建的 Dubbo控制台

    我们可以看出到,我们的服务都注册成功了,然后我们访问,http://127.0.0.1:8761/initOrder?userId=1 ,我们获取到了数据。

    我们这时查看监控中心,我们可以看到检测到了我们的应用。

    我们还可以看服务调用的一些统计 信息 和 图表

    源码

    https://github.com/gf-huanchupk/DubboLearning

    扫码关注我的公众号,精彩内容不能错过!
    展开全文
  • springboot集成dubbo过程坑太多,dubbo提供者和消费者分别在单独的springboot程序中使用成功(各种坑),结果后面用springboot多模块开发,将dubbo提供者消费者springboot程序分别作为一个模块集成近来,之前还可以...

    注:本文只是介绍我成功使用springboot dubbo 多模块项目的配置及核心代码,若问题没得到解决或需要可运行的源码,文章末尾有说明

    springboot集成dubbo过程坑太多,dubbo提供者和消费者分别在单独的springboot程序中使用成功(各种坑),结果后面用springboot多模块开发,将dubbo提供者、消费者springboot程序分别作为一个模块集成近来,之前还可以的duboo消费者又出问题了,@Reference注解无效报空指针null问题!简直无语+崩溃。

    又花了大半天网上找来找去加上自己摸索尝试终于解决问题,springboot多模块集成dubbo成功!赶紧做笔记记录下来。

    springboot 集成 dubbo 提供者比较简单基本没什么问题,而消费者的@Reference注解就有一堆的坑,各种出幺蛾子。(当然,吐槽归吐槽,dubbo还是非常棒的,感谢阿里开发dubbo团队。)

    关于dubbo版本依赖选择

    网上见的比较多的2个版本dubbo依赖

            <!-- dubbo依赖 -->
            <dependency>
                <groupId>com.alibaba.spring.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>2.0.0</version>
            </dependency>
    

    		<!-- dubbo依赖 -->
            <dependency>
                <groupId>io.dubbo.springboot</groupId>
                <artifactId>spring-boot-starter-dubbo</artifactId>
                <version>1.0.0</version>
                <!-- 避免依赖冲突,也就是避免阿里巴巴的dubbo中自带的spring依赖跟我们自己添加的依赖产生冲突 -->
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.jboss.netty</groupId>
                        <artifactId>netty</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    

    不在springboot dubbo多模块项目中,上面2个版本的dubbo依赖我都成功使用过,但是在多模块项目中 spring-boot-starter-dubbo这个版本dubbo依赖死活不成功(当然是我没有找到正确的方法),后面改用 dubbo-spring-boot-starter 版本依赖在springboot dubbo多模块项目中成功启动运行.

    下面介绍我在springboot dubbo多模块项目中集成dubbo的提供者、消费者 配置和核心代码

    springboot集成dubbo的 提供者 和 消费者 的配置及部分核心代码

    • dubbo服务接口
    package com.example.springbootapi.dubbo.service;
    
    /**
     * @author
     */
    public interface UserService {
        public String print(String s);
    }
    
    
    • dubbo提供者

    pom.xml (dubbo依赖、zookeeper依赖、zkclient依赖)

            <dependency>
                <groupId>com.alibaba.spring.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>2.0.0</version>
            </dependency>
            <dependency>
                <groupId>com.github.sgroschupf</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.14</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
                <scope>compile</scope>
            </dependency>
    

    springboot配置文件 application.properties

    server.port=9991
    #应用名
    spring.dubbo.application.name=provider
    #dubbo依赖版本为dubbo-spring-boot-starter时,dubbo提供者必须有这个server=true
    spring.dubbo.server=true
    #注册中心地址
    spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
    #协议端口
    spring.dubbo.protocol.name=dubbo
    spring.dubbo.protocol.port=20880
    #扫描包,接口服务实现的包,根据个人接口服务类所在位置自己做修改
    spring.dubbo.scan=com.example.springbootserver.service
    

    dubbo实现接口服务类

    package com.example.springbootserver.service;
    
    import com.alibaba.dubbo.config.annotation.Service;
    import com.example.springbootapi.dubbo.service.UserService;
    import org.springframework.stereotype.Component;
    
    @Service(interfaceClass = UserService.class)
    @Component
    public class UserServiceImpl implements UserService {
        @Override
        public String print(String s) {
            return "say:" + s;
        }
    }
    

    springboot启动入口启动类

    package com.example.springbootserver;
    
    import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @EnableDubboConfiguration
    @SpringBootApplication
    public class SpringbootserverApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootserverApplication.class, args);
        }
    
    }
    
    
    • dubbo消费者

    pom.xml (dubbo依赖、zookeeper依赖、zkclient依赖)

            <!-- dubbo依赖 -->
            <dependency>
                <groupId>com.alibaba.spring.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>2.0.0</version>
            </dependency>
            <dependency>
                <groupId>com.github.sgroschupf</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.14</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
                <scope>compile</scope>
            </dependency>
    

    springboot配置文件 application.properties

    server.port=9992
    #dubbo消费者配置放在dubbo-consumer.xml中
    

    dubbo-consumer.xml

    <?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.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
        <dubbo:application name="client"/>
        <dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="60000"/>
        <!--关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。url="dubbo//172.16.1.112:20880"-->
        <dubbo:consumer check="false" />
    
        <!--reference 采用xml配置实现,在代码中获取远程服务需要加注解@Autowired-->
        <dubbo:reference id="UserService" check="false"  interface="com.example.springbootapi.dubbo.service.UserService"/>
    
        <!-- 需要使用到提供者服务的包路径,多个包时用逗号隔开。注: 网上好多这里写错了 -->
        <dubbo:annotation package="com.example.springbootclient.controller"/>
    </beans>
    

    dubbo远程服务获取

    package com.example.springbootclient.controller;
    
    import com.example.springbootapi.dubbo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /**
     * @author
     */
    @Controller
    public class UserController {
        //reference 在xml配置,这里需要用注解Autowired
        @Autowired
        public UserService userService;
    
        @RequestMapping("/test")
        @ResponseBody
        public String test(){
            String s = userService.print("hhhhhhhhhhh");
            return s;
        }
    }
    

    springboot启动入口启动类

    package com.example.springbootclient;
    
    import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.ImportResource;
    
    /**
     * 消费者: 先扫描dubbo 然后 扫描spring
     * @author
     */
    @EnableDubboConfiguration
    @ImportResource(locations = {"classpath:dubbo-consumer.xml"})
    @ComponentScan(basePackages = "com.example.springbootclient.controller")
    @SpringBootApplication
    public class SpringbootclientApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringbootclientApplication.class, args);
        }
    
    }
    
    

    上面介绍的配置、代码 均来自 我的博文里的 springboot dubbo系列第三篇

    最后

    本文只是简单将 在springboot 集成dubbo 的提供者和消费者 的配置及部分核心代码展示,以及一些建议。如果能解决读者问题,那是最好了,如果还没有解决的话,可以看下我前面写的springboot 入门系列文章,都有详细开发过程及可以运行的源码。第一、二篇简单入门上手,第三篇介绍springboot dubbo多模块项目开发附源码,第四篇介绍springboot dubbo多模块项目开发有模块既是消费者又是提供者附源码。

    若哪里说的不对,请评论指出谢谢!

    展开全文
  • dubbo消费者和提供者之间传递参数

    千次阅读 2019-01-24 16:17:38
    dubbo消费者和提供者之间传递参数 背景: 在分布式系统中,消费者和提供者中都有记录请求日志的需要,但是又不在一个应用程序中。如何让请求参数自动的从消费者传递到提供者上是接下来要解决的问题。 1.消费者...

    dubbo在消费者和提供者之间传递参数

    背景:

    在分布式系统中,消费者和提供者中都有记录请求日志的需要,但是又不在一个应用程序中。如何让请求参数自动的从消费者传递到提供者上是接下来要解决的问题。

    1.消费者代码

    @Activate(group = "CONSUMER")
    public class ConsumerContextFilter implements Filter {
    	
    	@Override
    	public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
    		Result result = null;
    		setAttachment(invoker,invocation);
    		try {
    			//执行业务逻辑
    			result = invoker.invoke(invocation);
    		}catch(RpcException e) {
    			throw e;
    		}finally {
    			//清理
    			RpcContext.getContext().clearAttachments();
    		}
    		return result;
    	}
    	
    	private void setAttachment(Invoker<?> invoker,Invocation invocation) {
    		try {
    			RpcContext.getContext()
    			          .setInvoker(invoker)
    			          .setInvocation(invocation)
    			          .setAttachment("key","value");
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

    2.提供者代码

    @Activate(group = "PROVIDER")
    public class ProviderContextFilter implements Filter {
    	
    	@Override
    	public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
    		Result result = null;
    		getAttachment(invoker,invocation);
    		try {
    			//执行业务逻辑
    			result = invoker.invoke(invocation);
    		}
    		return result;
    	}
    	
    	private void getAttachment(Invoker<?> invoker, Invocation invocation) {
    		try {
    			Map<String,String> attachments = RpcContext.getContext().
    					setInvoker(invoker).setInvocation(invocation).getAttachments();
    			String value = attachments.get("key");
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
    展开全文
  • Dubbo是一个分布式服务框架,致力于提供高性能透明化的RPC远程服务调用方案,以及SOA服务治理方案。 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-...

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
    其核心部分包含:
    远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
    集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
    自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
    下面介绍dubbo环境搭建及相关demo

    dubbo相关环境搭建

    一、jdk和tomcat安装,很多人都会,不会的网上搜,一大把。


    二、zookeeper的安装

    1.下载Zookeeper-3.4.6.tar.gz 地址http://www.apache.org/dist/zookeeper/

    2.把下载文件拷贝到指定路径并解压

    tar zxvf zookeeper-3.4.6 .tar.gz

    解压后的路径:/usr/local/dubbo/zookeekper/zookeeper-3.4.6

    3.进入根路径下的conf目录,拷贝zoo_sample.cfg到zoo.cfg,因为Zookeeper 在启动时会找zoo.cfg这个文件作为默认配置文件,命令如下:

    cp zoo_sample.cfg zoo.cfg

    4.进入根路径下的bin目录,启动服务,命令如下:

    ./zkServer.sh start

    日志打印如下,启动成功
    这里写图片描述

    三、配置dubbo-admin的管理页面

    1.下载dubbo源码,然后打包,下载地址:https://github.com/dangdangdotcom/dubbox
    源码下载后导入到ide中,执行打包命令:mvn clean install -Dmaven.test.skip=true
    打包后的目录结构:
    这里写图片描述

    2.拷贝dubbo-admin-2.8.4.war到tomcat下的webapp中,修改dubbo.properties文件
    这里写图片描述
    主要修改zookeeper地址,和刚才配置的zookeeper地址一致

    3.启动tomcat:
    这里写图片描述

    访问http://192.168.0.108:8080/dubbo-admin-2.8.4/(根据自己的地址做出修改),登录名和密码默认都是root,能出现以下界面证明配置成功
    这里写图片描述

    至此,dubbo的简单配置已经完成
    接下来继续dubbo的使用demo

    dubbo提供者和消费者demo

    1.新建一个maven多模块项目,我的项目目录如下:
    这里写图片描述

    dubboProvider和dubboConsumer依赖dubboApi
    相关依赖

     <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.luojun</groupId>
                <artifactId>dubboApi</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.8.4</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo-rpc-rest</artifactId>
                <version>2.8.4</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo-rpc-webservice</artifactId>
                <version>2.8.4</version>
            </dependency>
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.6</version>
                <exclusions>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
            </dependency>
        </dependencies>

    2.api相关代码,就一个简单的接口:

    /**
     * Created by lj on 2017/6/29.
     */
    public interface HelloService {
        /**
         * 向世界问好
         * @return
         */
        String sayHello();
    }

    3.提供者相关代码:

    /**
     * Created by lj on 2017/6/29.
     */
    public class HelloServiceImpl implements HelloService{
    
        public String sayHello() {
            return "hello world .....";
        }
    }

    4.dubbo-provider.xml内容:

    <?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.xsd
           http://code.alibabatech.com/schema/dubbo
           http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <dubbo:application name="hello-world-app" owner="luojun"></dubbo:application>
        <!--zookeeper注册中心 -->
        <dubbo:registry address="zookeeper://192.168.0.108:2181"></dubbo:registry>
        <!--<dubbo:registry address="zookeeper://192.168.1.103:2181"></dubbo:registry>-->
    
        <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
        <!-- 发布这个服务 -->
        <dubbo:service interface="com.luojun.serivce.HelloService" ref="helloService"></dubbo:service>
    
        <bean class="com.luojun.HelloServiceImpl" id="helloService"></bean>
    
    </beans>

    5.提供者测试代码:

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

    6.执行main方法,刷新http://192.168.0.108:8080/dubbo-admin-2.8.4/governance/services,出现以下界面,说明服务启动注册成功
    这里写图片描述

    以下为消费者相关


    7.消费者配置文件dubbo-consume.xml:

    <?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.xsd
           http://code.alibabatech.com/schema/dubbo
           http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <dubbo:application name="hello-world-consume" owner="luojun"></dubbo:application>
        <!--zookeeper注册中心 -->
        <dubbo:registry address="zookeeper://192.168.0.108:2181"></dubbo:registry>
        <!--<dubbo:registry address="zookeeper://192.168.1.103:2181"></dubbo:registry>-->
    
        <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
        <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
        <dubbo:reference id="helloService" interface="com.luojun.serivce.HelloService" ></dubbo:reference>
    
    
    </beans>

    8.消费者测试代码:

    public class DubboConsumer
    {
        public static void main( String[] args ) throws Exception
        {
    
            ApplicationContext context=new ClassPathXmlApplicationContext("classpath:*.xml");
            HelloService service= (HelloService) context.getBean("helloService");
            System.out.println(service.sayHello());
        }
    }

    9.执行main方法,控制台如下:
    这里写图片描述

    刷新http://192.168.0.108:8080/dubbo-admin-2.8.4/governance/consumers,出现以下界面:

    这里写图片描述

    到此dubbo提供者和消费者demo新建完成且测试通过

    附件:
    demo源码
    dubbo-admin-2.8.4.war

    展开全文
  • dubbo消费者源码分析

    2019-07-11 12:21:34
    根据上面的图先总结一下dubbo消费者初始化调用的流程 1.当消费者端调用getBean获取服务提供者的实例的时候,dubbo的消费者初始化就开始了; 2.RefrenceConfig首先会获取到消费者端的配置信息(主要包括注册中心...
  • dubbo管理工具,一个war包,直接解压放到tomcat Root目录下。 一个dubbo提供者demo一个dubbo消费者demo。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,024
精华内容 809
关键字:

dubbo消费者和提供者