spring-cloud-dubbo

作者: 凌康ACG | 来源:发表于2019-12-16 01:24 被阅读0次

    spring cloud的设计理念是integrate everything。充分利用现有开源组件,在他们之上设计一套统一规范/接口使他们能够接入spring cloud体系并且能够无缝切换底层实现,使他们能够集成到一起良好运作。最典型的例子就是DiscoveryClient,只要实现DiscoveryClient相关接口,spring cloud的底层注册中心可以随意更换,dubbo的注册中心也有SPI规范进行替换。

    本项目的目标是将dubbo融入到spring cloud生态中,使微服务之间的调用同时具备restful和dubbo调用的能力。做到对业务代码无侵入,无感知:引入jar包则微服务间调用使用dubbo,去掉jar包则使用默认的restful。实现参考的是 Spring Cloud 中文社区的 Spring Cloud Dubbo 项目https://github.com/SpringCloud/spring-cloud-dubbo

    一、创建父工程、依赖管理

    1、创建父工程

    创建文件夹spring-cloud-dubbo,然后在里面创建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>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.qbccn</groupId>
        <artifactId>spring-cloud-dubbo-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <url>http://www.qbccn.com</url>
    
        <modules>
            <module>spring-cloud-dependencies</module>
        </modules>
    
        <properties>
            <java.version>1.8</java.version>
            <maven.compiler.source>${java.version}</maven.compiler.source>
            <maven.compiler.target>${java.version}</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>com.qbccn</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${project.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <profiles>
            <profile>
                <id>default</id>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                <properties>
                    <spring-javaformat.version>0.0.12</spring-javaformat.version>
                </properties>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>io.spring.javaformat</groupId>
                            <artifactId>spring-javaformat-maven-plugin</artifactId>
                            <version>${spring-javaformat.version}</version>
                        </plugin>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-surefire-plugin</artifactId>
                            <configuration>
                                <!-- 设置默认跳过测试 -->
                                <includes>
                                    <include>**/*Tests.java</include>
                                </includes>
                                <excludes>
                                    <exclude>**/Abstract*.java</exclude>
                                </excludes>
                                <systemPropertyVariables>
                                    <java.security.egd>file:/dev/./urandom</java.security.egd>
                                    <java.awt.headless>true</java.awt.headless>
                                </systemPropertyVariables>
                            </configuration>
                        </plugin>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-enforcer-plugin</artifactId>
                            <executions>
                                <execution>
                                    <id>enforce-rules</id>
                                    <goals>
                                        <goal>enforce</goal>
                                    </goals>
                                    <configuration>
                                        <rules>
                                            <bannedDependencies>
                                                <excludes>
                                                    <exclude>commons-logging:*:*</exclude>
                                                </excludes>
                                                <searchTransitive>true</searchTransitive>
                                            </bannedDependencies>
                                        </rules>
                                        <fail>true</fail>
                                    </configuration>
                                </execution>
                            </executions>
                        </plugin>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-install-plugin</artifactId>
                            <configuration>
                                <skip>true</skip>
                            </configuration>
                        </plugin>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-javadoc-plugin</artifactId>
                            <configuration>
                                <skip>true</skip>
                            </configuration>
                            <inherited>true</inherited>
                        </plugin>
                    </plugins>
                </build>
            </profile>
        </profiles>
        <repositories>
            <repository>
                <id>alimaven</id>
                <name>aliyun maven</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
    
            <repository>
                <id>spring-milestone</id>
                <name>Spring Milestone</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
    
            <repository>
                <id>spring-snapshot</id>
                <name>Spring Snapshot</name>
                <url>https://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-milestone</id>
                <name>Spring Milestone</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
            <pluginRepository>
                <id>spring-snapshot</id>
                <name>Spring Snapshot</name>
                <url>https://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    </project>
    

    用IDEA的maven导入,来打开这个文件夹

    2、创建统一依赖管理

    在spring-cloud-dubbo下创建文件夹spring-cloud-dependencies,在spring-cloud-dependencies中创建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.qbccn</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <url>http://www.qbccn.com</url>
        <properties>
            <dubbo.version>2.7.2</dubbo.version>
            <dubbo-actuator.version>2.7.1</dubbo-actuator.version>
            <dubbo-spring-boot-starter>2.7.3</dubbo-spring-boot-starter>
            <dubbo-registry-nacos>2.6.7</dubbo-registry-nacos>
            <nacos-client>1.0.0</nacos-client>
            <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
            <spring-cloud-alibaba.verion>0.9.0.RELEASE</spring-cloud-alibaba.verion>
            <alibaba-spring-context-support.version>1.0.2</alibaba-spring-context-support.version>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>${spring-cloud-alibaba.verion}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.dubbo</groupId>
                    <artifactId>dubbo</artifactId>
                    <version>${dubbo.version}</version>
                    <exclusions>
                        <exclusion>
                            <groupId>org.springframework</groupId>
                            <artifactId>spring</artifactId>
                        </exclusion>
                        <exclusion>
                            <groupId>javax.servlet</groupId>
                            <artifactId>servlet-api</artifactId>
                        </exclusion>
                        <exclusion>
                            <groupId>log4j</groupId>
                            <artifactId>log4j</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
                <dependency>
                    <groupId>org.apache.dubbo</groupId>
                    <artifactId>dubbo-spring-boot-actuator</artifactId>
                    <version>${dubbo-actuator.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.dubbo</groupId>
                    <artifactId>dubbo-spring-boot-starter</artifactId>
                    <version>${dubbo-spring-boot-starter}</version>
                </dependency>
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>dubbo-registry-nacos</artifactId>
                    <version>${dubbo-registry-nacos}</version>
                </dependency>
                <dependency>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                    <version>${nacos-client}</version>
                </dependency>
                <dependency>
                    <groupId>com.alibaba.spring</groupId>
                    <artifactId>spring-context-support</artifactId>
                    <version>${alibaba-spring-context-support.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <repositories>
            <repository>
                <id>alimaven</id>
                <name>aliyun maven</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
    
            <repository>
                <id>spring-milestone</id>
                <name>Spring Milestone</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>spring-snapshot</id>
                <name>Spring Snapshot</name>
                <url>https://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <pluginRepositories>
            <pluginRepository>
                <id>spring-milestone</id>
                <name>Spring Milestone</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
            <pluginRepository>
                <id>spring-snapshot</id>
                <name>Spring Snapshot</name>
                <url>https://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    </project>
    
    image.png

    刷新maven

    二、创建服务生产者

    spring-cloud-dubbo下创建文件夹spring-cloud-provider,在spring-cloud-provider中创建pomx.ml:

    <?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>
        <parent>
            <groupId>com.qbccn</groupId>
            <artifactId>spring-cloud-dubbo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    
        <artifactId>spring-cloud-provider</artifactId>
        <packaging>pom</packaging>
        <url>http://www.qbccn.com</url>
    
        <modules>
    
        </modules>
    </project>
    

    然后在父工程加上子项目:spring-cloud-provider

    <module>spring-cloud-provider</module>
    
    parent.png
    1、在子项目spring-cloud-provider下创建spring-cloud-demo-api,在spring-cloud-demo-api下创建pom:
    <?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>
        <parent>
            <groupId>com.qbccn</groupId>
            <artifactId>spring-cloud-provider</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    
        <artifactId>spring-cloud-demo-api</artifactId>
        <packaging>jar</packaging>
        <url>http://www.qbccn.com</url>
        <inceptionYear>2019-Now</inceptionYear>
    </project>
    

    创建接口:

    package com.qbccn.provider.demo.api;
    
    public interface SayHiService {
        public String sayHi(String msg);
    }
    
    image.png
    2、在子项目spring-cloud-provider下创建spring-cloud-demo-service,在spring-cloud-demo-service下创建pom:
    <?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>
        <parent>
            <groupId>com.qbccn</groupId>
            <artifactId>spring-cloud-provider</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    
        <artifactId>spring-cloud-demo-service</artifactId>
        <packaging>jar</packaging>
        <url>http://www.qbccn.com</url>
        <inceptionYear>2019-Now</inceptionYear>
        <dependencies>
            <!-- Spring Boot Begin -->
            <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>
            <!-- Spring Boot End -->
            <!-- Apache Dubbo Begin -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo-registry-nacos</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.spring</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>
    
            <!--project start-->
            <dependency>
                <groupId>com.qbccn</groupId>
                <artifactId>spring-cloud-demo-api</artifactId>
                <version>${project.parent.version}</version>
            </dependency>
            <!--project end-->
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration><mainClass>com.qbccn.provider.demo.ProviderDemoApplication</mainClass></configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    项目spring-cloud-provider的pom下加入子项目

        <modules>
            <module>spring-cloud-demo-api</module>
            <module>spring-cloud-demo-service</module>
        </modules>
    
    image.png
    然后maven刷新,在spring-cloud-demo-service中创建src/main/java和resources

    spring-cloud-demo-service中实现接口:

    package com.qbccn.provider.demo.service;
    
    import com.qbccn.provider.demo.api.SayHiService;
    import org.apache.dubbo.config.annotation.Service;
    import org.springframework.beans.factory.annotation.Value;
    
    @Service(version = "1.0.0")
    public class SayHiServiceImpl implements SayHiService {
        @Value("${dubbo.protocol.port}")
        public String port;
    
        @Override
        public String sayHi(String msg) {
            return "say Hi :" + msg + " port:" + port;
        }
    }
    

    实现如下:

    package com.qbccn.demo.service.impl;
    
    import com.qbccn.demo.service.SayHiService;
    import org.apache.dubbo.config.annotation.Service;
    import org.springframework.beans.factory.annotation.Value;
    
    /**
     * @author linke
     * @date 2019-12-15 下午 22:52
     * @description
     */
    @Service(version = "1.0.0")
    public class SayHiServiceImpl implements SayHiService {
        @Value("${dubbo.protocol.port}")
        private String port;
    
        @Override
        public String sayHi(String msg) {
            return "Hi 你说了:" + msg + " port:" + port;
        }
    }
    

    application.yml如下:

    spring:
      main:
        allow-bean-definition-overriding: true
      application:
        name: spring-cloud-demo-service
    
    dubbo:
      application:
        name: spring-cloud-demo-service
      protocol:
        name: dubbo
        port: -1     #-1表示随机分配端口
      registry:
        address: nacos://192.168.112.1:8848  #我用nacos做注册中心
      scan:
        base-packages: com.qbccn.provider.demo.service  #dubbo扫描的包
    

    我们启动这个生产者:ps:启动前需要启动好nacos注册中心,官网https://nacos.io

    image.png

    http://127.0.0.1:8848/nacos/index.html账号和密码都是:nacos看到提供者:

    image.png

    三、创建消费者

    spring-cloud-dubbo下创建spring-cloud-consumer文件夹,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>
        <parent>
            <groupId>com.qbccn</groupId>
            <artifactId>spring-cloud-dubbo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    
        <artifactId>spring-cloud-consumer</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <url>http://www.qbccn.com</url>
        <modules>
            <module>spring-cloud-consumer-demo</module>
        </modules>
    </project>
    

    spring-cloud-consumer下创建spring-cloud-consumer-demo项目,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>
        <parent>
            <groupId>com.qbccn</groupId>
            <artifactId>spring-cloud-dubbo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    
        <artifactId>spring-cloud-consumer</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <url>http://www.qbccn.com</url>
        <modules>
            <module>spring-cloud-consumer-demo</module>
        </modules>
    </project>
    

    application.yml:

    spring:
      application:
        name: spring-cloud-consumer-demo
      main:
        allow-bean-definition-overriding: true
    dubbo:
      application:
        name: spring-cloud-consumer-demo
      scan:
        base-packages: com.qbccn.consumer.demo.comtroller
      protocol:
        name: dubbo
        port: -1
      registry:
        address: nacos://192.168.112.1:8848  #我用nacos做注册中心
    server:
      port: 8080
    endpoints:
      dubbo:
        enabled: true
    management:
      health:
        dubbo:
          status:
            defaults: memory
            extras: threadpool
      endpoints:
        web:
          exposure:
            include: "*"
    

    WebComtroller:

    package com.qbccn.consumer.demo.comtroller;
    
    import com.qbccn.provider.demo.api.SayHiService;
    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.RestController;
    
    @RestController
    public class WebComtroller {
        @Reference(version = "1.0.0")
        private SayHiService sayHiService;
    
        @GetMapping(value = "/sayHi/{msg}")
        public String echo(@PathVariable String msg) {
            return sayHiService.sayHi(msg);
        }
    }
    
    image.png
    启动消费者可以看到已经注册到nacos:
    image.png
    健康检查地址:http://localhost:8080/actuator/health
    {
        "status": "UP"
    }
    

    访问http://localhost:8080/sayHi/lingkang

    image.png
    项目源码:https://gitee.com/lingkang_top/spring-cloud-dubbo
    下一篇:《基于nacos实现config配置》

    相关文章

      网友评论

        本文标题:spring-cloud-dubbo

        本文链接:https://www.haomeiwen.com/subject/dkblnctx.html