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

相关推荐
Mos_x4 分钟前
计算机组成原理核心知识点梳理
java·后端
墨寒博客栈8 分钟前
Linux基础常用命令
java·linux·运维·服务器·前端
回忆是昨天里的海12 分钟前
k8s-部署springboot容器化应用
java·容器·kubernetes
INFINI Labs24 分钟前
使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理
java·docker·eureka·devops·docker compose·console·easyserach
Cosolar25 分钟前
国产麒麟系统 aarch64 架构 PostgreSQL 15 源码编译安装完整教程
java·后端
GalaxyPokemon32 分钟前
PlayerFeedback 插件开发日志
java·服务器·前端
天天摸鱼的java工程师1 小时前
别再写那些重复代码了!8年Java老兵教你用 Hutool 提升开发效率
java·后端
喝杯绿茶1 小时前
springboot中的事务
java·spring boot·后端
麦兜*1 小时前
多阶段构建:打造最小化的 Spring Boot Docker 镜像
java·spring boot·后端·spring cloud·docker
oak隔壁找我1 小时前
Spring Boot Starter 入门教程
java·后端