当前位置: 首页 > news >正文

15-利用dubbo远程服务调用

本文介绍利用apache dubbo调用远程服务的开发过程,其中利用zookeeper作为注册中心。关于zookeeper的环境搭建,可以参考我的另一篇博文:14-zookeeper环境搭建。

0、环境

  • jdk:1.8
  • zookeeper:3.8.4
  • dubbo:2.7.5
  • springboot: 2.7.18

1、项目介绍

本项目包含两个服务:user-service和order-service。user-service作为服务的provider,order-service是consumer。下面咱们一步步开始。下图是两个项目的结构,大家先从整体上认识一下。
在这里插入图片描述
在这里插入图片描述

2、开工

按照上图的项目规划,先创建user-service项目,创建完成后,引入springboot:

	<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version></parent>

2.1 user-service-api

这个模块就是个普通的java模块,主要用来定义user-service对外暴露的接口,当然实际中的异常定义、pojo也要放在这个模块。这也是dubbo官方最佳实践的建议。这个模块不需要依赖于开发框架,我们只写一个接口:

public interface IUserService {String getUserName(String id);
}

接口写完后,将该模块install到maven库,便于order-service使用。如何install,利用ide或命令行都行,install完成后在你的本地仓库能看到对应的jar就说明成功了。

2.2 user-service-provider

见名知意,这个服务是服务的提供者,首先要实现IUserService接口,其次通过dubbo将服务发布出来供其他服务调用。重点来了,咱们一步步来。

2.2.1 引入依赖

	  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.5</version></dependency><!--zookeeper--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.1.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.1.0</version></dependency><!--上面install的--><dependency><groupId>com.jackie</groupId><artifactId>user-service-api</artifactId><version>1.0-SNAPSHOT</version></dependency>

2.2.2、实现接口

@Service
public class UserServiceImpl implements IUserService {@Overridepublic String getUserName(String id) {return "李明明 @ " + System.currentTimeMillis();}
}

注意:@Service是dubbo的包,不要引入spring的。dubbo3开始,改成了@DubboService,用来区别spring的注解。

2.2.3、启动类

@SpringBootApplication
@DubboComponentScan  //这个注解一定要有
public class UserServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(UserServiceProviderApplication.class, args);}}

2.2.4、配置文件

server:port: 8082spring:application:admin: user-service-providerdubbo:application:name: user-service-providerqos-enable: false //如果为true,需要配置相应的未被占用的端口protocol:port: 20880name: dubboregistry:address: zookeeper://localhost:2181

咱们使用zookeeper作为注册中心,需要配置正确的zookeeper地址,我这里是本地启的服务。到此为止provider服务就开发完成了。下面开发consumer服务

2.3、order-service

consumer端先对服务端就简单的多,先来引入依赖,因为要用springboot和zookeeper,这些以来少不了,看代码:

 		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.jackie</groupId><artifactId>user-service-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.5</version></dependency><!--zookeeper--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.1.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.1.0</version></dependency>

2.3.1、调用远程服务

@Component 
public class UserService {public String getUserName(String id) {return userService.getUserName(id);}@Referenceprivate IUserService userService;
}

说明:

  • @Reference:dubbo的注解,用于说明远程服务的引用,这里可以从zookeeper获取服务地址。
  • @Component:spring的注解。

2.3.2、启动类和Controller

@SpringBootApplication
@RestController
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}@GetMapping("/order/username")public String findUserName(@RequestParam("id") String id) {return userService.getUserName(id);}@Autowiredprivate UserService userService;}

2.2.3 order-service服务的配置文件

server:port: 8081dubbo:application:name: order-serviceprotocol:name: dubboregistry:address: zookeeper://localhost:2181

3、测试

分别启动order-service、user-service、zookeeper。打开浏览器,访问http://localhost:8081/order/username?id=1,效果如下图:
在这里插入图片描述

http://www.lryc.cn/news/513913.html

相关文章:

  • 【Rust自学】8.5. HashMap Pt.1:HashMap的定义、创建、合并与访问
  • 未来网络技术的新征程:5G、物联网与边缘计算(10/10)
  • LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作
  • Uniapp在浏览器拉起导航
  • 公平联邦学习——多目标优化
  • 奇怪的Python:为何字符串要设置成不可变的?
  • Vue-Router之嵌套路由
  • MyBatis使用的设计模式
  • arm rk3588 升级glibc2.31到2.33
  • 【Linux系列】sed命令的深入解析:如何使用sed删除文件内容
  • C++ 设计模式:桥接模式(Bridge Pattern)
  • MATLAB中whitespacePattern函数用法
  • Django多字段认证的实现
  • 【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错
  • SQL进阶技巧:如何分析连续签到领金币数问题?
  • 1、ELK的架构和安装
  • Vue2/Vue3使用DataV
  • 汇编环境搭建
  • Android 系统 `android.app.Fragment` 类的深度定制与常见问题解析
  • linux ueditor nginx https 后台配置项返回格式出错,上传功能将不能正常使用
  • 【机器学习 | 数据挖掘】时间序列算法
  • uniapp H5 对接 声网,截图
  • 家谱管理系统|Java|SSM|VUE| 前后端分离
  • 【LeetCode】200、岛屿数量
  • idea报错:There is not enough memory to perform the requested operation.
  • python ai ReAct 代理(ReAct Agent)
  • HTML入门教程|| HTML 基本标签(2)
  • MySQL root用户密码忘记怎么办(Reset root account password)
  • groovy:多线程 简单示例
  • SOME/IP 协议详解——序列化