springCloud整合Dubbo案例

前言:

好久没有使用dubbo了,温习一下。

一、先搭建一个SpringCloud框架

整体框架如下图

1. 先创建一个父工程:

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.fan</groupId>
    <artifactId>springclouddubbo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>provider</module>
        <module>consumer</module>
        <module>common</module>
    </modules>
    <packaging>pom</packaging>


    <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>

    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

注意:刚创建时还没有 <modules>

2. 子工程 provider

XML 复制代码
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.8.RELEASE</version>
        </dependency>
    </dependencies>
复制代码
ProviderApplication启动类:
java 复制代码
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

3. 子工程 consumer

pom同上,ConsumerApplication启动类:

java 复制代码
@SpringBootApplication
public class ConsumerApplication {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
  1. 分别创建对应的controller与service

provider

java 复制代码
@Service
public class UserService {
    public String getUser() {
        return "user";
    }
}
java 复制代码
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user")
    public String getUser() {
        return userService.getUser();
    }
}

consumer

java 复制代码
@Service
public class OrderService {

    // 使用restTemplate,调用服务提供者的Controller方法
    @Autowired
    private RestTemplate restTemplate;

    public String getUser() {
        String forObject = restTemplate.getForObject("http://localhost:8080/user", String.class);
        return forObject;
    }
}
java 复制代码
@RestController
public class UserController {

    @Autowired
    private OrderService orderService;

    @GetMapping("/order")
    public String getUser() {
        return orderService.getUser();
    }
}

分别启动provider、consumer, 访问http://localhost:8081/order 查看是否成功。

二、改造Dubbo

1.为provider、consumer添加pom依赖

添加dubbo核心依赖、添加要使用的协议的依赖、添加要使用的注册中心依赖,这里我使用nacos作为注册中心需要引入俩个依赖。

XML 复制代码
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.0.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-rpc-dubbo</artifactId>
            <version>3.0.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-zookeeper</artifactId>
            <version>3.0.7</version>
        </dependency>

2.配置dubbo相关的基本信息

配置application.properties,注意修改consumer对应的name

XML 复制代码
server.port=8081
dubbo.application.name=provider-application
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dobbo.protocol.host=127.0.0.1
dubbo.registry.address=zookeeper://127.0.0.1:2181
XML 复制代码
server.port=8082

dubbo.application.name=consumer-application
dubbo.registry.address=zookeeper://127.0.0.1:2181

3. 改造项目

由于dubbo是面向接口的形式,所以我们不在使用 RestTemplate 要替换为对应的服务接口。

(1)修改provider

创建userseivce接口

java 复制代码
public interface UserService {
    public String getUser();
}

实现该接口

java 复制代码
// 可以为Dubbo服务添加对应的版本
@DubboService(version = "1.0")
public class UserServiceImpl implements UserService {
    public String getUser() {
        return "user";
    }
}

@DubboService:SpringBoot将添加该注解的方法发布为Dubbo服务。

由于我们要提供服务接口,所以 provider中的controller已经没有用了,这里可以删除了。

(2)创建公共模块,抽象服务接口

创建公共模块,common,将provider中的 UserService移动到common中

为provider、consumer添加公共模块的依赖

XML 复制代码
        <dependency>
            <groupId>com.fan</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

(3)修改consumer

java 复制代码
@Service
public class OrderService {

    @DubboReference
    private UserService userService;

    public String getUser() {
        return userService.getUser();
    }
}
  • @DubboReference:注入远程服务的代理对象。

(4)启动类开启@EnableDubbo

@EnableDubbo:用于扫描@DubboService(加在启动类上,就会扫描启动类所在包及其子包内的所有@DubboService),并把对应的对象实例化,发布成RPC服务。

@DubboComponentScan:如果需要扫描其他包下的注解使用。

在yml配置文件中,扫描包dubbo.scan.base-packages 等同于**@EnableDubbo**注解

4. 启动项目

先启动 provider、再启动consumer,浏览器访问:http://localhost:8082/order

相关推荐
憶巷几秒前
MyBatis中动态SQL执行原理
java·sql·mybatis
重生之绝世牛码几秒前
Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解
java·大数据·开发语言·设计模式·享元模式·设计原则
seasugar6 分钟前
记一次Maven拉不了包的问题
java·maven
Allen Bright15 分钟前
【Java基础-26.1】Java中的方法重载与方法重写:区别与使用场景
java·开发语言
苹果酱056716 分钟前
Golang的文件解压技术研究与应用案例
java·vue.js·spring boot·mysql·课程设计
秀儿y19 分钟前
单机服务和微服务
java·开发语言·微服务·云原生·架构
ybq1951334543120 分钟前
javaEE-多线程案例-单例模式
java·开发语言
seasugar36 分钟前
Maven怎么会出现一个dependency-reduced-pom.xml的文件
xml·java·maven
一只淡水鱼6640 分钟前
【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis
java·数据库·spring·mybatis
唐叔在学习1 小时前
【唐叔学算法】第19天:交换排序-冒泡排序与快速排序的深度解析及Java实现
java·算法·排序算法