首页 > 其他分享 >Netty+Nacos+Disruptor自研企业级API网关-江潭落月复西斜

Netty+Nacos+Disruptor自研企业级API网关-江潭落月复西斜

时间:2023-05-27 13:03:05浏览次数:43  
标签:Netty 网关 name final private 企业级 new public

Netty+Nacos+Disruptor自研企业级API网关

download:3w 51xuebc com

使用Netty和Spring Boot实现仿微信的示例

在本文中,我们将使用Netty和Spring Boot框架来创建一个简单的聊天应用程序,类似于微信。这个应用程序将支持多用户聊天和即时消息发送。下面让我们来一步步看看如何实现。

第一步:设置项目结构和依赖项

首先,我们需要创建一个新的Spring Boot项目,并添加必要的依赖项。我们需要添加以下依赖项:

  • Spring Boot Starter Web
  • Spring Boot Starter Data JPA
  • Netty

第二步:创建数据库模型

接下来,我们将创建一个数据库模型,表示用户和消息之间的关系。我们可以使用Hibernate框架来实现这个模型。

@Entity
@Table(name = "users")
public class User {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @Column(name = "name", nullable = false, unique = true)
    private String name;
 
    // getters and setters
 
}
@Entity
@Table(name = "messages")
public class Message {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "from_user_id", nullable = false)
    private User fromUser;
 
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "to_user_id", nullable = false)
    private User toUser;
 
    @Column(name = "content", nullable = false)
    private String content;
 
    // getters and setters
 
}

第三步:创建Netty服务器

接下来,我们将使用Netty框架来创建一个聊天服务器。我们需要定义一个ChannelInitializer类,用于初始化Netty的管道。

@Component
public class ChatServerInitializer extends ChannelInitializer<SocketChannel> {
 
    private final ChatServerHandler chatServerHandler;
 
    @Autowired
    public ChatServerInitializer(ChatServerHandler chatServerHandler) {
        this.chatServerHandler = chatServerHandler;
    }
 
    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
 
        pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
        pipeline.addLast(new StringDecoder());
        pipeline.addLast(new StringEncoder());
 
        pipeline.addLast(chatServerHandler);
    }
}

然后,我们需要创建一个Netty服务器,并将它绑定到一个端口上。

@Component
public class ChatServer {
 
    private final EventLoopGroup bossGroup;
    private final EventLoopGroup workerGroup;
    private final ServerBootstrap serverBootstrap;
 
    @Autowired
    public ChatServer(ChatServerInitializer chatServerInitializer) {
        bossGroup = new NioEventLoopGroup();
        workerGroup = new NioEventLoopGroup();
        serverBootstrap = new ServerBootstrap();
 
        serverBootstrap.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(chatServerInitializer);
    }
 
    public void start(int port) throws InterruptedException {
        serverBootstrap.bind(port).sync().channel().closeFuture().sync();
    }
 
    public void stop() {
        workerGroup.shutdownGracefully();
        bossGroup.shutdownGracefully();
    }
}

第四步:处理Netty消息

我们需要实现一个Handler类,用于处理Netty管道中的消息。在这个示例中,我们需要解析客户端发送的JSON消息,并将其保存到数据库中。

@Component
@ChannelHandler.Sharable
public class ChatServerHandler extends SimpleChannelInboundHandler<String> {
 
    private final ObjectMapper objectMapper;
    private final UserService userService;
    private final MessageService messageService;
 
    @Autowired
    public ChatServerHandler(ObjectMapper objectMapper, UserService userService, MessageService messageService) {
        this.objectMapper = objectMapper;
        this.userService = userService;
        this.messageService = messageService;
    }
 
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        JsonNode jsonNode = objectMapper.readTree(msg);
 
        if (!jsonNode.has("from") || !jsonNode.has("to") || !jsonNode.has("content")) {
            return;
        }
 
        User fromUser = userService.findByName(jsonNode.get("from").asText());
        User toUser =

标签:Netty,网关,name,final,private,企业级,new,public
From: https://blog.51cto.com/u_16123966/6361931

相关文章

  • Netty实战(五)
    (ByteBuf—Netty的数据容器)一、什么是ByteBuf我们前面说过,网络数据的基本单位总是字节。JavaNIO提供了ByteBuffer作为它的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐。ByteBuffer替代品是ByteBuf,一个强大的实现,既解决了JDKAPI的局限性,又为网络应用程序的开发者......
  • Netty实战(五)
    一、什么是ByteBuf我们前面说过,网络数据的基本单位总是字节。JavaNIO提供了ByteBuffer作为它的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐。ByteBuffer替代品是ByteBuf,一个强大的实现,既解决了JDKAPI的局限性,又为网络应用程序的开发者提供了更好的API。下面我......
  • Android平台如何实现外部RTSP|RTMP流注入轻量级RTSP服务模块(内网RTSP网关)
     技术背景今天分享的是外部RTSP或RTMP流,拉取后注入到本地轻量级RTSP服务模块,供内网小并发场景下使用,这里我们叫做内网RTSP网关模块。内网RTSP网关模块,系内置轻量级RTSP服务模块扩展,完成外部RTSP/RTMP数据拉取并注入到轻量级RTSP服务模块工作,多个内网客户端直接访问内网轻量级RTSP......
  • 多功能RTU环境采集网关支持温湿度风速采集
    无线工业物联网数据采集控制短信报警终端S475/S475E系列在工业物联网产业链中发挥着非常重要的作用,可以广泛应用于很多领域,例如智能电网、智能交通、智能家居、金融、移动POS终端、供应链自动化、工业自动化等。该系列产品内嵌工业级GSM/GPRS/3G/4G通信模块,并集成了稳定可靠......
  • Netty实战(三)
    (Netty的组件和设计)一、Channel、EventLoop和ChannelFuture上一篇博文我们在构建服务端和客户端中出现了一些新的类,可能有些同学还有些不了解它们的具体功能。没关系,接下来我们对于Channel、EventLoop和ChannelFuture类进行的讨论增添更多的细节,这些类合在一起,可以被认为......
  • elasticsearch在启动后出现[transport.netty][solr001] exception caught on transpor
    elasticsearch在启动后出现如下错误:[2019-04-18T09:29:57,850][WARN][o.e.t.n.Netty4Transport ][xHaZmSP]exceptioncaughtontransportlayer[[id:0xe6246f88,L:/127.0.0.1:9300-R:/127.0.0.1:9493]],closingconnectionjava.io.IOException:杩滅▼涓绘満寮鸿揩鍏......
  • .NET技术:构建高效稳定的企业级应用程序
    在当今数字化的时代,企业对于高效、稳定和可扩展的应用程序需求日益增长。作为一个资深的.NET开发人员,我深知.NET技术的强大之处以及它在企业级应用程序开发中的重要性。本篇博客将探讨.NET技术在构建高效稳定的企业级应用程序中的关键优势,并分享一些实用的开发技巧和最佳实践。一、......
  • Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connectio
    现象:今天在启动项目时,本项目使用了Elasticsearch服务,发现后台报这个错误:Causedby:io.netty.channel.AbstractChannel$AnnotatedConnectException:Connectionrefused:nofurtherinformation:/127.0.0.1:9300错误信息提示如下图:原因:本项目使用了Elasticsearch搜索服务,而报错信......
  • 边缘计算AI硬件智能分析网关V1版的接入流程与使用步骤
    我们的AI边缘计算网关硬件——智能分析网关目前有两个版本:V1版与V2版,两个版本都能实现对监控视频的智能识别和分析,支持抓拍、记录、告警等,在AI算法的种类上和视频接入上,两个版本存在些许的区别。V1的基础算法有人体检测、区域入侵检测、戴口罩识别、安全帽识别;V2目前有15种算法,包括......
  • MobTech 秒验|运营商网关取号​
    一键登录验证基于运营商数据网关取号技术,那什么是数据网关取号呢?首先我们先要搞懂什么是网关。网关是当我们想要在不同的网络之间传输和交换数据时需要用到一种网络设备。它可以根据我们要发送的数据包中的目的地址,选择最佳的路由路径,将数据包发送给下一个网关或目标主机。如果我们......