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

dubbo http流量接入dubbo后端服务

简介

dubbo协议是基于TCP的二进制私有协议,更适合作为后端微服务间的高效RPC通信协议,也导致dubbo协议对于前端流量接入不是很友好。在dubo框架中,有两种方式可以解决这个问题:

  • 多协议发布【推荐】,为dubbo协议服务暴露rest风格的http协议访问方式。
  • 通过网关实现 http->dubbo协议转换,这种方式需要将http协议转换为后端服务能识别的dubbo协议,要求网关必须支持dubbo协议。

同时发布http、dubbo协议

dubbo框架支持为同一个服务发布多个协议,并且支持客户端通过同一个端口以不同的协议访问服务。

发布方式一

dubbo协议的基础上增加tri协议

dubbo:protocol:name: dubboport: 20080ext-protocol: tri
public interface DemoService01 {String buyApple(Apple apple);String sayHello(String name);
}public class Apple implements Serializable {private static final long serialVersionUID = 1L;private String name;public Apple(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Apple{" +"name='" + name + '\'' +'}';}
}

访问

curl --header "Content-Type:application/json"  --data '{"name":"apple"}' http://localhost:20880/com.doudou.rpc.api.DemoService01/buyApple curl --header "Content-Type:text/html"  --data "name" http://localhost:20880/com.doudou.rpc.api.DemoService01/sayHello 
发布方式二

只使用tri协议

dubbo:protocol:name: triport: 50053

访问

curl --header "Content-Type:application/json"  --data '{"name":"apple"}' http://localhost:50053/com.doudou.rpc.api.DemoService01/buyApple curl --header "Content-Type:text/html"  --data "name" http://localhost:50053/com.doudou.rpc.api.DemoService01/sayHello 
使用REST风格

引入javax.ws.rs-api

<dependency><groupId>javax.ws.rs</groupId><artifactId>javax.ws.rs-api</artifactId><version>2.1.1</version>
</dependency>

在使用方法上添加路径注解

import com.alibaba.fastjson2.JSON;
import com.doudou.demo.api.DemoService;
import com.doudou.demo.po.User;
import org.apache.dubbo.config.annotation.DubboService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;@Path("/demo")
@DubboService
public class DemoServiceImpl implements DemoService {private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);/*** curl --header "Content-Type:text/html"  --data "word" http://localhost:50051/demo/hello* curl --header "Content-Type:text/html"  --data "word" http://localhost:50051/com.doudou.demo.api.DemoService/sayHello*/@Path("/hello")@POST@Overridepublic String sayHello(String name) {logger.info("name:{}", name);return "hello " + name;}/*** curl -X POST --header "Content-Type:text/html" http://localhost:50051/demo/hello2/world*/@Path("/hello2/{name}")@POST@Overridepublic String sayHello2(@PathParam("name") String name) {logger.info("name 2:{}", name);return "hello 2 " + name;}/*** curl -X POST --header "Content-Type:application/json" "http://localhost:50051/demo/hello3?name=doudou"*/@Path("/hello3")@POST@Overridepublic String sayHello3(@QueryParam("name") String name) {logger.info("name 3:{}", name);return "hello 3 " + name;}/*** curl -X POST "http://localhost:50051/demo/hello4" --header "Content-Type: application/x-www-form-urlencoded"  -d "name=admin"* curl -X POST "http://localhost:50051/com.doudou.demo.api.DemoService/sayHello4" --header "Content-Type: application/x-www-form-urlencoded"  -d "name=admin1"** @FormParam 用于接收表单数据‌(application/x-www-form-urlencoded 或 multipart/form-data):*/@Path("/hello4")@POST@Consumes(MediaType.APPLICATION_FORM_URLENCODED)  // 必须指定表单类型@Overridepublic String sayHello4(@FormParam("name") String name) {logger.info("name 4:{}", name);return "hello 4 " + name;}/*** curl -X POST --header "Content-Type:application/json" -H "name: world" http://localhost:50051/demo/hello5* curl -X POST --header "Content-Type:application/json" -H "name: world" http://localhost:50051/com.doudou.demo.api.DemoService/sayHello5*/@Path("/hello5")@POST@Overridepublic String sayHello5(@HeaderParam("name") String name) {logger.info("name 5:{}", name);return "hello 5 " + name;}/*** curl -X POST --header "Content-Type:application/json" -H "cookie:name=world" http://localhost:50051/demo/hello6* curl -X POST --header "Content-Type:application/json" -H "cookie:name=world" http://localhost:50051/com.doudou.demo.api.DemoService/sayHello6*/@Path("/hello6")@POST@Overridepublic String sayHello6(@CookieParam("name") String name) {logger.info("name 6:{}", name);return "hello 6 " + name;}/***  curl -X POST --header "Content-Type:application/json" --data '{"id":1,"name":"world"}'  http://localhost:50051/com.doudou.demo.api.DemoService/sayHello7*  curl -X POST --header "Content-Type:application/json" --data '{user:{"id":1,"name":"world"}, user2:{"id":2,"name":"world2"}}'  http://localhost:50051/com.doudou.demo.api.DemoService/sayHello7**  {"id":1,"name":"world"}*/@Path("/hello7")@POST@Overridepublic String sayHello7(User user, User user2) {logger.info("user:{}", JSON.toJSONString(user));logger.info("user2:{}", JSON.toJSONString(user2));return JSON.toJSONString(user);}
}

使用网关转http协议为dubbo协议

网关需要实现的关键点:

  • 协议转换,支持http到dubbo协议的转换,包括参数映射。
  • 自动地址发现,支持Nacos、Zookeeper、Kubernetes等主流注册中心,动态感知后端dubbo实例变化。
  • 结合dubbo协议的路由,如在发起 dubbo 协议调用时,支持按照特定规则地址筛选、传递附加参数到 dubbo 后端服务。

支持的开源网关

  • Higress
  • Apache APISIX
  • Apache Shenyu

参考HTTP网关接入->dubbo协议

原文地址:https://blog.csdn.net/zzw_17600691357/article/details/146611926
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/96803.html

相关文章:

  • Android学习之计算器app(java + 详细注释 + 源码)
  • 在Windows下使用Docker部署Nacos注册中心(基于MySQL容器)
  • 华为交换综合实验——VRRP、MSTP、Eth-trunk、NAT、DHCP等技术应用
  • MySQL数据库学习笔记1.SQL(1)
  • 使用 GitHub Pages 快速部署静态网页
  • Mysql之事务(下)
  • Linux安装Ubuntu24.04系统 并安装配置Nvidia 4090 显卡驱动
  • 论文阅读笔记:Denoising Diffusion Implicit Models (2)
  • STM32_HAL之程序编写、编译、烧写、上板测试初体验
  • 使用SpringBoot + Thymeleaf + iText实现动态PDF导出
  • git 按行切割 csv文件
  • echarts+HTML 绘制3d地图,加载散点+散点点击事件
  • C#:第一性原理拆解属性(property)
  • Anaconda和Pycharm的区别,以及如何选择两者
  • k8s 1.30 安装ingress-nginx
  • 为什么 Three.js 里 Cannon.js 物体堆叠时会有空隙?
  • 【C语言】深入理解指针(三):C语言中的高级指针应用
  • Prompt攻击是什么
  • Anolis系统下安装Jenkins
  • 检查是否存在占用内存过大的SQL