• SpringBoot2.X整合集成Dubbo


    环境安装

    Dubbo使用zookeeper作为注册中心,首先要安装zookeeper。
    Windows安装zookeeper如下:
    https://blog.csdn.net/qq_33316784/article/details/88563482
    Linux安装zookeeper如下:
    https://www.cnblogs.com/expiator/p/9853378.html

    SpringBoot新建项目

    如果还不清楚怎么新建SpringBoot项目,可以参考: https://www.cnblogs.com/expiator/p/15844275.html

    服务提供者Dubbo-provider

    创建了dubbo-provider模块,作为服务提供者。

    dubbo有多种groupId,其中的org.apache.dubbo的版本,比较适合SpringBoot2.X,注解不会过期或者失效。
    引入 org.apache.dubbo 的包,dubbo的版本号设置在 2.7.5 。

    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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example</groupId>
        <artifactId>dubbo-provider</artifactId>
        <version>1.0-SNAPSHOT</version>
        <name>dubbo-provider</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <spring-boot.version>2.2.2.RELEASE</spring-boot.version>
            <dubbo.version>2.7.5</dubbo.version>
            <curator.version>4.2.0</curator.version>
            <zookeeper.version>3.4.12</zookeeper.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-web</artifactId>
            </dependency>
    
    	<!-- dubbo,注意要使用 org.apache.dubbo的groupId -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
    
            <!-- zookeeper依赖 -->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>${zookeeper.version}</version>
            </dependency>
    
            <!-- zookeeper的api管理依赖 -->
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>${curator.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    application.yml

    在resources文件下添加 application.yml,配置如下:

    dubbo:
      application:
        # 应用名称
        name: dubbo-provider
      protocol:
        # 协议名称
        name: dubbo
        # 协议端口
        port: 20880
      registry:
        # 注册中心地址
        address: zookeeper://127.0.0.1:2181
    
    server:
      # 修改端口号,避免端口冲突
      port: 8081
    
    

    pojo类:

    @Data 是 lombok注解,相当于getter、setter、toString等方法。
    @NoArgsConstructor也是 是 lombok注解,相当于没有参数的构造方法。
    @AllArgsConstructor 是包含所有参数的构造方法。

    如果不用lombok,也可以自行替换成相应的方法。

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User implements Serializable {
        private static final long serialVersionUID = -4294369157631461921L;
        Long userId;
        String userName;
        String userInfo;
    }
    
    

    service:

    
    public interface UserService {
        String getUserInfo();
    
        User getUserById(String userId);
    }
    

    service实现类:

    注意,@service注解,引入的包是org.apache.dubbo.config.annotation.Service

    import org.apache.dubbo.config.annotation.Service;
    import org.springframework.stereotype.Component;
    
    /**
     * 注意,@service注解,引入的包是org.apache.dubbo.config.annotation.Service
     */
    @Service
    @Component
    public class UserServiceImpl implements UserService {
    
        @Override
        public String getUserInfo() {
            return "userTest";
        }
    
        @Override
        public User getUserById(String userId) {
            User user = new User();
            user.setUserId(Long.valueOf(userId));
            user.setUserInfo("test");
            user.setUserName("lin");
            return user;
        }
    
    }
    

    SpringBoot启动类:

    注意:

    /**
     * 提供服务的应用配置DubboComponentScan注解,指定扫描的service所在的文件
     */
    @SpringBootApplication
    @DubboComponentScan("com.example.service")
    public class DubboProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DubboProviderApplication.class, args);
        }
    
    }
    

    install服务提供者dubbo-provider

    在idea中,对服务提供者dubbo-provider的依赖, 用Maven执行clean,并install到Maven仓库,就可以提供给其他模块使用。

    服务消费者 dubbo-consumer

    新建一个服务消费者 dubbo-consumer的maven项目。

    pom.xml

    pom.xml中,服务消费者 dubbo-consumer 的依赖跟之前的类似,只是还要引入服务提供者dubbo-provider的依赖,这样才能调用其中的Service。

    <!-- 引入服务提供者的依赖,注意版本号 -->
    <dependency>
    	<groupId>com.example</groupId>
    	<artifactId>dubbo-provider</artifactId>
    	<version>1.0-SNAPSHOT</version>
    </dependency>
    

    application.yml

    类似 dubbo-provider, 可以将端口号修改为 8082,避免端口号冲突

    ConsumerController 类:

    import com.example.pojo.User;
    import com.example.service.UserService;
    import org.apache.dubbo.config.annotation.Reference;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/user")
    public class ConsumerController {
        /**
         * 通过 @Reference注解调用远程服务,也就是服务提供者dubbo-provider的服务
         */
        @Reference
        private UserService userService;
    
    
        @GetMapping("/info")
        public String getUserById() {
            return userService.getUserInfo();
        }
    
    
        @GetMapping("/{id}")
        public User getUserById(@PathVariable String id) {
            return userService.getUserById(id);
        }
    
    }
    
    

    DubboConsumerApplication启动类:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class DubboConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DubboConsumerApplication.class, args);
        }
    }
    

    启动项目

    没有启动 zookeeper会报错:

    Caused by: java.lang.IllegalStateException: zookeeper not connected
    	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:80) ~[dubbo-2.7.5.jar:2.7.5]
    	... 32 common frames omitted
    	
    
    • 端口号被占用,需要修改端口号,否则会报错。
    Web server failed to start. Port 8080 was already in use.
    Action:
    Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
    
    • 启动报错:
    Whitelabel Error Page
    This application has no explicit mapping for /error, so you are seeing this as a fallback.
    

    解决方法:https://www.cnblogs.com/expiator/p/15837518.html

    • 先启动Provider,再启动Consumer

    启动成功如下:

    参考资料:

    https://www.jb51.net/article/178946.htm

  • 相关阅读:
    objcopy使用
    linux中的strip命令简介
    strace命令详解
    bash执行顺序:alias --> function --> builtin --> program
    Ubuntu下安装docker
    uvm中类继承和phase
    error和exception有什么区别?
    sleep() 和 wait() 有什么区别?
    CSS3实现环形进度条?
    请写出你最常见到的5个runtime exception?
  • 原文地址:https://www.cnblogs.com/expiator/p/15837603.html
Copyright © 2020-2023  润新知