首页 > 编程语言 >小马哥Java分布式架构训练营第一期服务治理-鱼龙潜跃水成文

小马哥Java分布式架构训练营第一期服务治理-鱼龙潜跃水成文

时间:2023-05-27 13:02:52浏览次数:38  
标签:Netty Java name private final 潜跃水 new public 小马哥

小马哥Java分布式架构训练营第一期服务治理

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,Java,name,private,final,潜跃水,new,public,小马哥
From: https://blog.51cto.com/u_16123966/6361934

相关文章

  • JAVA的内部类
    JAVA的内部类写在一个类里面的类就叫内部类分类成员内部类:写在成员位置的,属于外部类的成员静态内部类:是一种特殊的成员内部类局部内部类:将内部类定义在方法里面匿名内部类:隐藏了名字的内部类,可以写在成员位置也可以写在局部位置获取成员内部类的两种方法当成......
  • Java语言的简单介绍
    1.计算机语言概述​计算机语言是一种特殊的语言。因为它是用于人与计算机之间传递信息的,所以人和计算机都能“读懂”。具体地说,一方面,人们要使用计算机语言指挥计算机完成某种特定动作,就必须对这种工作进行特殊描述,所以它能够被人们读懂。另一方面,计算机必须按计算机语言描......
  • java开发学习框架
    Java基础1.1.Java简介与安装1.2.Java基本语法1.3.数据类型与变量1.4.运算符与表达式1.5.流程控制(分支与循环)1.6.数组面向对象编程2.1.类与对象2.2.继承与多态2.3.接口与抽象类2.4.封装与访问控制2.5.重载与覆盖2.6.Java内存管理与垃圾回收Java常用......
  • 1.1. Java简介与安装
    Java简介Java是一种广泛使用的计算机编程语言,由JamesGosling和他的团队在SunMicrosystems公司开发,于1995年首次发布。Java的设计理念是“一次编写,到处运行”,这意味着Java应用程序可以在任何支持Java运行时环境(JRE)的设备上运行,而无需重新编译。Java的主要特点包括:面向对象:Java......
  • Java基本语法
    类与文件名在Java中,每个程序都是以类为基础进行编写的。一个简单的Java程序通常包含一个类,类名应该以大写字母开头。Java源代码文件的文件名必须与类名相同,并以.java作为文件扩展名。例如,下面是一个名为HelloWorld的简单Java程序:publicclassHelloWorld{publ......
  • Java基本语法
    类与文件名在Java中,每个程序都是以类为基础进行编写的。一个简单的Java程序通常包含一个类,类名应该以大写字母开头。Java源代码文件的文件名必须与类名相同,并以.java作为文件扩展名。例如,下面是一个名为HelloWorld的简单Java程序:publicclassHelloWorld{pub......
  • Java 进阶 - SpringJPA 持久层框架
    参考资料https://spring.io/projects/spring-data-jpa介绍SpringDataJPA是Spring基于ORM(ObjectRelationalMapping)框架、JPA规范的基础上封装的一套JPA应用框架,底层使用了Hibernate的JPA技术实现,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了......
  • From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
    FromJavaToKotlin,空安全、扩展、函数、Lambda概述(Summarize)Kotlin是什么?可以做什么?Android官方开发语言从Java变为Kotlin,Java有哪些问题?Kotlin的优点Kotlin特性(Features)Kotlin是什么?Kotlin出自于捷克一家软件研发公司JetBrains,这家公司开发出很多优秀的......
  • Java 中的运算符和流程控制(附面试题)
    算术运算符Java中的算法运算符,包括以下几种:算术运算符名称举例+加法1+2=3-减法2-1=1*乘法2*3=6/除法24/8=3%求余24%7=3++自增1inti=1;i++--自减1inti=1;i--我们本讲要重点讲的是“++”和“--”,其他的算术运算符相对比较简单直观,本讲就不花精力去讲解了,之所以要把“++”和......
  • 全面掌握 Java 中的异常处理(附面试题)
    在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点。比如,try-catch处理要遵循的原则是什么,finally为什么总是能执行,try-catch为什么比较消耗程序的执行性能等问题,我们本讲内容都会给出相应的答案,当然还有面试中经常被问到的异常模块的一些面......