前言:
好久没有使用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);
}
}
- 分别创建对应的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