网关编程介绍

网关一般分为外网网关和内网网关。外网网关主要负责做限流、入侵预防、请求转发等工作。内网网关主要还是做负载均衡、流量管理调度和入侵预防等工作。

外网网关
蜘蛛嗅探识别

外网网关可以实现限流和入侵检测功能,预防一些常见的入侵。其中最常见也是最严重的就是非法引用和机器人抓取。

  • 非法引用:会大量的引用我们的网络资源,可以使用refer方式来预防,如果refer不是本站域名就拒绝请求,这种方式可以降低我们的资源被非法引用的风险。

  • 机器人抓取:两类用户区分,匿名用户的请求,需要根据IP记录统计请求排行时间块,肥西请求热点IP,请求频率过高的IP会被重点关注;登录用户,用时间块记录单个用户的请求次数及频率,超过一定程度就拒绝请求,同时将用户列入怀疑名单,方便进一步确定。

确定怀疑名单中的用户请求,通过网关对特定用户或IP动态注入JS嗅探代码,这个代码会在Cookie及LocalStorage内写入特殊密文,前端JS代码检测到密文后,就会进入反机器人模式。反机器人模式可以识别客户端是否有鼠标移动及点击动作,以此判断是否为机器人。确定用户没问题后,才会对服务端发送再次签名的密文请求解锁。如果客户端一直没有回馈,就自动将怀疑用户列为准备封禁用户,并封禁该请求,当一个IP被封禁的请求达到一定程度就会进行封禁。

网关鉴权与用户中心解耦

用户业务请求发送到业务接口时,首先由网关来鉴定请求用户的身份,如果鉴定通过,用户的信息就会通过header传递给后面的服务,而业务的API无需关注用户中心的实现细节,只需接受header中附带的用户信息即可,如果业务要求用户登录才能使用,可以在业务中增加一个对请求header是否由uid的判断,如果没有uid,则给前端返回统一的错误码,提醒用户登录。

内网网关服务

内网网关可以提供失败重试服务和平滑重启机制。

失败重试

当项目重启或宕机的时候,服务会短暂不可以,如果用户发起请求,就会返回504错误,对用户来说体验很不好,可以用内网网关的自动重试功能,服务服务返回500、403、504等错误时,网关不会立马返回错误,而是等待一会,再次重试,或者返回上次的缓存内容,这样就能是实现业务热更新的平滑升级,让服务看起来更稳定。

平滑重启

在服务升级的时候,可以不让服务进程收到kill信号后直接退出,而是先让服务停止接受新的请求,等之前的请求处理完成后,如果超过10秒则直接退出。通过这个机制,用户请求处理就不会被中断,保证了业务事务是完整的。

内外网关综合应用
服务接口缓存

网关接口缓存功能,利用网关实现一些接口返回内容的缓存,适合用在服务降级场景,用它来短暂地缓解用户流量的冲击,或者用于降低内网流量的冲击。

网关是西安缓存基本都是用临时缓存+TTL方式实现,请求到达网关,如果网关有该API的缓存,直接返回缓存中的内容给客户端,这样大大降低后端的数据服务压力。这个方式会牺牲数据的强一致性,对缓存能力的性能要求比较高,必须保证网关缓存可以扛得住外网流量的QPS。

也可以配合脚本定时刷新缓存数据,网关查到缓存的数据就会返回,没有命中才真正请求到后端服务上并缓存结果,这样更加灵活,数据的一致性也会更好。

服务监控

网关做服务监控,可以通过网关访问日志中的http code判断业务是否正常,配合不同请求的耗时信息,就能实现简单的系统监控功能。

可以周期性地聚合访问日志中的错误,将其汇总起来,通过汇总不同接口请求的错误数,接口响应速度等情况来分析服务状态。如果我们结合 Trace,还可以将访问日志中落地 Traceid,这样就能根据 Traceid 进一步排查问题原因。

学习来源:极客时间 《高并发系统实战课》学习笔记 网关编程 Day5

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
由于您没有给出更具体的要求,我将提供一个简单的Java UDP Socketdemo,用于将从客户端发送的消息转发到服务器,并将从服务器返回的消息发送回客户端。 ```java import java.io.IOException; import java.net.*; public class UDPSocketGateway { private DatagramSocket clientSocket; private DatagramSocket serverSocket; private InetAddress serverAddress; private int serverPort; public UDPSocketGateway(int clientPort, String serverAddress, int serverPort) throws SocketException, UnknownHostException { clientSocket = new DatagramSocket(clientPort); serverSocket = new DatagramSocket(); this.serverAddress = InetAddress.getByName(serverAddress); this.serverPort = serverPort; } public void start() throws IOException { byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while (true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); System.out.println("Received from client: " + sentence); sendData = sentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort); serverSocket.send(sendPacket); System.out.println("Sent to server: " + sentence); receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); System.out.println("Received from server: " + sentence); sendData = sentence.getBytes(); sendPacket = new DatagramPacket(sendData, sendData.length, receivePacket.getAddress(), receivePacket.getPort()); clientSocket.send(sendPacket); System.out.println("Sent to client: " + sentence); } } public static void main(String[] args) throws IOException { UDPSocketGateway gateway = new UDPSocketGateway(9876, "localhost", 9877); gateway.start(); } } ``` 在此示例中,我们创建了一个名为`UDPSocketGateway`的类,该类具有以下属性: - `clientSocket`和`serverSocket`:分别用于接收客户端和服务器发送的数据包。 - `serverAddress`和`serverPort`:分别用于指定服务器的IP地址和端口号。 在构造函数中,我们初始化这些属性,并在`start()`方法中实现了UDP Socket的主要逻辑。 在while循环中,我们首先从客户端接收数据并将其发送到服务器,然后等待服务器响应。一旦我们从服务器接收到响应,我们将其发送回客户端。 在主方法中,我们创建了一个`UDPSocketGateway`实例并调用其`start()`方法,以便启动UDP Socket。 请注意,此示例仅用于演示目的,并不适用于生产环境。在实际应用中,您需要采取适当的安全措施,例如验证输入和输出数据,对数据进行加密等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里学Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值