RPC全称为remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应 用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不 在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。
1.Dubbo的架构
2.Dubbo使用前安装Zookeeper,Dubbo管理控制台的dubbo-admin
Zookeeper的安装(在Lunix系统下安装)下载地址:http://archive.apache.org/dist/zookeeper/
- 安装 jdk
- 把 zookeeper 的压缩包(zookeeper-3.4.6.tar.gz)上传到 linux 系 统
- 解压缩压缩包 tar -zxvf zookeeper-3.4.6.tar.gz -C /usr
- 进入zookeeper-3.4.6目 录,创建data目录 mkdir data
- 进入conf目录 ,把zoo_sample.cfg 改名为zoo.cfg cd conf mv zoo_sample.cfg zoo.cfg
- 打开zoo.cfg文件, 修改data属性:dataDir=/usr/zookeeper-3.4.6/data
- zookeeper的操作 进入Zookeeper的bin目录 启动服务命令 ./zkServer.sh start
- 停止服务命令 ./zkServer.sh stop
- 查看服务状态: ./zkServer.sh status
- 客户端连接 ./zkCli.sh
Dubbo管理控制台的dubbo-admin
(1)将资料中的dubbo-admin-2.6.0.war文件复制到tomcat的webapps目录下
(2)启动tomcat,此war文件会自动解压
(3)修改WEB-INF下的dubbo.properties文件,注意dubbo.registry.address对应的值需要对应当前使用的Zookeeper的ip地址和端口号
dubbo.registry.address=zookeeper://192.168.134.129:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
(4)重启tomcat
访问 http://你的地址:8080/dubbo-admin-2.6.0
3.spring boot 整合Dobbo
创建三个模块:
前两个用springBoot创建,最后一个只是放接口和实体,用maven创建
dubbo-interface
依赖:
<groupId>org.song</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
<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>
</properties>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo implements Serializable {
private String name;
private String userId;
private String address;
}
接口
public interface CustomerService {
public List<UserInfo> initCustomer(String id);
public List<UserInfo> getUserInfoList(String id);
}
boot-dubbo-provider 服务提供
依赖:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.song</groupId>
<artifactId>boot-dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter Dubbo 与Spring Boot的整合依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!--接口的引入-->
<dependency>
<groupId>org.song</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件:application.yml
#端口设置
server:
port: 9001
#dubbo的设置
dubbo:
application:
name: boot-dubbo-provider
#dubbo在zookeeper的注册地址
registry:
address: zookeeper://192.168.126.135:2181
#注册 协议和port
protocol:
name: dubbo
port: 20881
核心代码:
//@Service这个注解不是spring框架的注解,是dobbo的注解,表示这是一个对外发布服务
@Service
@Component
public class UserInfoServiceImpl implements UserInfoService {
@Override
public List<UserInfo> getUserInfoList(String id) {
UserInfo userInfo1 = new UserInfo("1", "李四", "北京");
UserInfo userInfo2 = new UserInfo("2", "王五", "上海");
return Arrays.asList(userInfo1, userInfo2);
}
}
启动器注解:
/**@EnableDubbo
* 表示开启Dubbo注解
*/
@SpringBootApplication
@EnableDubbo
public class BootDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootDubboProviderApplication.class, args);
}
}
boot-dubbo-customer 服务消费
依赖:与 boot-dubbo-provider一样
配置文件:application.yml
server:
port: 9005
dubbo:
application:
name: boot-dubbo-customer
registry:
address: zookeeper://192.168.126.135:2181
核心代码:
service层
@Service
public class CustomeServiceImpl implements CustomerService {
/**
* @Reference
* Dubbo提供的注解,动态代理服务提供者对外发布的服务
*/
@Reference
private UserInfoService UserInfo;
@Override
public List<UserInfo> initCustomer(String id) {
List<com.song.bean.UserInfo> userInfoList = UserInfo.getUserInfoList(id);
return userInfoList;
}
}
controller
@RestController
@RequestMapping("customer")
public class CustomerController {
@Resource
public CustomeServiceImpl service;
@RequestMapping("{id}")
public List<UserInfo> getUserInfo(@PathVariable("id")String id){
List<UserInfo> userInfos = service.initCustomer(id);
return userInfos;
}
}
启动器注解:
@SpringBootApplication
@EnableDubbo
public class BootDubboCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(BootDubboCustomerApplication.class, args);
}
}
测试
访问 :http://192.168.126.135:8080/dubbo-admin-2.6.0
可以看服务提供者与消费者
访问 :http://localhost:9005/customer/2
可以查询到,说明两个微服务间的调用成功