dubbo 实现简易分布式服务
时间:2022-01-18 作者:look-word
dubbo 实现简易分布式服务
服务器需要搭建zookeeper环境
zookeeper端口2181
还需要有java环境
1.需求
某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;
我们现在 需要创建两个服务模块进行测试
模块 | 功能 |
---|---|
订单服务web模块 | 创建订单等 |
用户服务service模块 | 查询用户地址等 |
测试预期结果
订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。
2.工程架构
3.创建项目
3.1 公共接口层 ego-interface
简单maven项目即可
1.修改域名文件
<dependencies>
<dependency>
<groupId>域名ectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${域名sion}</version>
</dependency>
</dependencies>
2.创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserAddress implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String userId;
private String userAddress;
}
3.创建公共接口
UserService
public interface UserService {
/**
* 查询用户的所有地址
* @return
*/
public List<UserAddress> queryAllAddress(Integer id);
}
OrderService
public interface OrderService {
/**
* 根据用户id 查找订单
* @param uid 用户id
* @return 订单
*/
public List<UserAddress> initOrder(Integer uid);
}
3.2 用户服务模块 ego-user-service-provider (服务提供者)
1.修改域名文件
<dependencies>
<!-- 这里是公共接口层哦-->
<dependency>
<groupId>域名</groupId>
<artifactId>03-ego-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>域名aba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.7</version>
</dependency>
<dependency>
<groupId>域名ec</groupId>
<artifactId>zkclient</artifactId>
<version>域名</version>
</dependency>
<!-- curator-framework -->
<dependency>
<groupId>域名tor</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>域名y</groupId>
<artifactId>netty-all</artifactId>
<version>域名.Final</version>
</dependency>
</dependencies>
2.创建服务实体类
@Service
public class UserServiceImpl implements UserService {
private static List<UserAddress> addresses=new ArrayList<UserAddress>();
static {
域名(new UserAddress(1,"1","湖南省株洲市荷塘区湖南化工职业技术学院"));
域名(new UserAddress(2,"2","湖南省永州市祁阳县"));
}
@Override
public List<UserAddress> queryAllAddress(Integer id) {
return addresses;
}
}
域名
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://域名/schema/beans"
xmlns:xsi="http://域名/2001/XMLSchema-instance"
xmlns:context="http://域名/schema/context"
xmlns:dubbo="http://域名/schema/dubbo"
xsi:schemaLocation="http://域名/schema/beans http://域名/schema/beans/spring-域名
http://域名/schema/context http://域名/schema/context/spring-域名
http://域名/schema/dubbo http://域名/schema/dubbo/域名
http://域名/schema/dubbo http://域名/schema/dubbo/域名">
<!-- 声明应用程序的名称 -->
<dubbo:application name="ego-user-service-provider"/>
<!--指定注册中心的地址 -->
<dubbo:registry
address="zookeeper://服务器IP地址:2181"/>
<!--使用dubbo协议,将服务暴露在20880端口 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 声明要暴露的实现类的对象-->
<bean id="userService"
class="域名域名ServiceImpl"/>
<!-- 进行服务暴露 -->
<dubbo:service interface="域名域名Service"
ref="userServiceImpl"/>
</beans>
4.测试服务
TestProvider
public class TestProvider {
public static void main(String[] args) throws IOException {
ApplicationContext ac=
new ClassPathXmlApplicationContext("classpath:域名");
域名tln("服务提供者启动成功");
域名();
}
}
3.3 订单服务(服务消费者) ego-order-service-consumer
1.修改域名文件
<dependencies>
<!-- 这里是公共接口层哦-->
<dependency>
<groupId>域名</groupId>
<artifactId>03-ego-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>域名aba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.7</version>
</dependency>
<dependency>
<groupId>域名ec</groupId>
<artifactId>zkclient</artifactId>
<version>域名</version>
</dependency>
<!-- curator-framework -->
<dependency>
<groupId>域名tor</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>域名y</groupId>
<artifactId>netty-all</artifactId>
<version>域名.Final</version>
</dependency>
</dependencies>
2.创建服务实体类
@Service
public class OrderServiceImpl implements OrderService {
@Reference
private UserService userService;
public void setUserService(UserService userService) {
域名Service = userService;
}
@Override
public List<UserAddress> initOrder(Integer uid) {
return 域名yAllAddress(uid);
}
}
域名
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://域名/schema/beans"
xmlns:xsi="http://域名/2001/XMLSchema-instance"
xmlns:p="http://域名/schema/p"
xmlns:c="http://域名/schema/c" xmlns:dubbo="http://域名/schema/dubbo"
xmlns:context="http://域名/schema/context"
xsi:schemaLocation="http://域名/schema/beans
http://域名/schema/beans/spring-域名 http://域名/schema/dubbo http://域名/schema/dubbo/域名 http://域名/schema/context http://域名/schema/context/spring-域名">
<!-- 声明服务名称-->
<dubbo:application name="02-ego-order-service-consumer"/>
<!-- 指定注册中心地址-->
<dubbo:registry
address="zookeeper://服务器ip地址:2181"/>
<!-- 生成远程调用对象-->
<dubbo:reference
id="userService" interface="域名域名Service"/>
<!-- 创建订单对象-->
<bean id="orderService" class="域名域名rServiceImpl">
<property name="userService" ref="userService"/>
< </bean>
</beans>
测试类
public class TestConsumer {
public static void main(String[] args) throws IOException {
ApplicationContext ac=
new ClassPathXmlApplicationContext("classpath:域名");
OrderService orderService = (OrderService) 域名ean(域名s);
for (UserAddress userAddress : 域名Order(1)) {
域名tln(userAddress);
}
域名();
}
}