首页 > 其他分享 >golang实现设计模式之代理模式-优缺点,适用场景

golang实现设计模式之代理模式-优缺点,适用场景

时间:2023-06-09 18:24:10浏览次数:47  
标签:body string url 优缺点 代理 httpCode golang 对象 设计模式

代理模式作为一种结构型的设计模式,因为某种原因,需要对访问的对象通过代理访问目标对象,访问对象不适合或者不能直接引用该目标对象,代理就成为访问对象和目标对象的中介。

结构

  • 1.抽象主题(Subject)类。通过接口或抽象类声明真实主题和代理对象实现的业务方法。
  • 2.真实主题(Real Subject)类。实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  • 3.代理(Proxy)类。提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

优缺点

  • 优点

1.保护目标对象,访问对象只能通过代理访问到目标对象。
2.代理对象可扩展目标对象的功能。
3.通过代理,分离访问对象与目标对象的直接接触,降低耦合,增加扩展。

  • 缺点

1.代理模式会造成系统设计中类的数量增加。
2.在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢。
3.增加了系统的复杂度。

适用场景

  • 1.远程代理。可以隐藏一个对象存在于不同地址空间的事实,如 nginx。
  • 2.Copy-on-Write 代理。linux内核中大量使用。
  • 3.Cache代理。
  • 4.防火墙(Firewall)代理。

代码实现

package main

import "fmt"

/*
业务场景:
- 通过nginx代理web请求,client <-> nginx <-> realServer
- 通常在代理层,我们也可以完成一些额外处理,如限流,认证,负载均衡等,本case主要目的演示proxy模式的应用,额外功能见限流处理
 */


// 1.抽象服务,声明方法,代理类和真实服务类需要实现该接口
type Server interface {
   HandleRequest(url string, method string) (code int, msg string)
}

// 2.real server, 实现Server接口,实际请求处理
type Application struct {
   host string
   port int
}

func NewApplication() *Application {
   return &Application{"0.0.0.0", 8001}
}

func (r *Application) handleRequest(url string, method string) (code int, msg string) {
   // 路由处理
   if url == "/app/status" && method == "GET" {
      return 200, "OK"
   }

   if url == "/create/user" && method == "POST" {
      return 201, "User Created."
   }

   return 404, "Not Found."
}

// 3.proxy,实现Server接口,代理客户端请求,转发给real server,另简单实现限流功能
type NginxServer struct {
   application *Application
   maxAllowReq int
   rateLimiter map[string]int
}

func NewNginxServer(allowReq int) *NginxServer {
   return &NginxServer{
      application: NewApplication(),
      maxAllowReq: allowReq,
      rateLimiter: make(map[string]int),
   }
}

func (r *NginxServer) HandleRequest(url, method string) (code int, msg string) {
   isAllowed := r.checkRateLimiter(url)
   if !isAllowed {
      return 403, "Not Allowed."
   }
   // forward to real server
   return r.application.handleRequest(url, method)
}

func (r *NginxServer) checkRateLimiter(url string) bool {
   if r.rateLimiter[url] == 0 {
      r.rateLimiter[url] = 1
   }

   if r.rateLimiter[url] > r.maxAllowReq {
      return false
   }
   r.rateLimiter[url]++
   return true
}
// client
func main()  {
   ngx := NewNginxServer(2)
   appStatusURL := "/app/status"
   createuserURL := "/create/user"

   httpCode, body := ngx.HandleRequest(appStatusURL, "GET")
   fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)

   httpCode, body = ngx.HandleRequest(appStatusURL, "GET")
   fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)

   httpCode, body = ngx.HandleRequest(appStatusURL, "GET")
   fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)

   httpCode, body = ngx.HandleRequest(createuserURL, "POST")
   fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)

   httpCode, body = ngx.HandleRequest(createuserURL, "GET")
   fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)
}

参考文章:

标签:body,string,url,优缺点,代理,httpCode,golang,对象,设计模式
From: https://www.cnblogs.com/davis12/p/17469978.html

相关文章

  • golang实现设计模式之责任链模式-优缺点,适用场景
    责任链模式是一种行为型的设计模式,也叫职责链,定义:在这样的场景中,请求需要经过一系列的处理者,通过列表或者链表将处理者组合起来,请求依次被处理者处理,如果需要中断,也可以及时退出处理。上述的这种的应用场景,典型的就是在web应用中的中间件或者拦截器,比如Gin框架的中间件。结......
  • golang实现设计模式之策略模式-优缺点,适用场景
    策略模式是一种行为型的设计模式,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户,或者认为把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。结构1.抽象策略(Strategy)类。定义了一个公共接口,各种不......
  • golang实现设计模式之适配器模式-优缺点,适用场景
    适配器模式是一种结构型设计模式,它是通过接口转换,使得原先接口不被兼容的其他类可以一起工作。类型类结构型特点:-程序耦合性高-要求程序员对组件内部结构熟悉-应用相对少些类适配器模式可以用过继承的方式来实现。对象结构型特点:可重用性较差。对象适配器允许一......
  • golang实现设计模式之观察者模式-优缺点,适用场景
    观察者模式是一种行为型模式,其定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。观察者模式常用订阅/发布机制,即发布者持有所有订阅者,当发布者状态变更或者特定行为时,通知所有订阅者。结构1.发布者。属性及行为:属性,订阅者列表,行为,添加、删除订阅者方......
  • golang实现设计模式之模板模式-优缺点,适用场景
    模板模式是一种行为型设计模式,其定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。特点1.算法结构已确定。2.具体实现交由子类实现。结构1.抽象类(AbstractClass)。算法步骤可以被声明为抽......
  • 基于网卡地址做设备指纹的优缺点
    生成设备指纹的目的是为了能唯一地标识设备,而且这个标识在设备的生命周期内保持稳定。因此,在选择设备特征时,通常需要考虑这些特征的唯一性和稳定性。软件及配置信息一版不适合,是因为这类变化虽然不大,但万一变化后,设备指纹会变,影响使用。比如:操作系统信息:操作系统版本、安装日......
  • 4月29日邓老师设计模式面试资料 一般有用 看1
    【金三银四】设计模式篇1.谈谈你对设计模式的理解1.首先谈设计模式的作用:经验的传承,提高了软件复用的水平,最终达到提高软件开发效率设计原则简单说明单一职责一个类只负责一项职责里氏替换原则子类可以扩展父类的功能,但不能改变父类原有的功能依赖倒置原则要依......
  • 9.3 模版设计模式
    抽象类的设计应该是比类更高一层的设计。抽象类最大好处:1.对子类方法对统一管理;2.可以自身提供有一些普通方法,并且这些普通方法可以调用抽象方法(这些抽象方法必须在有子类提供实现的时候才会生效)abstractclassAction{ //定义公共行为类 publicstaticfinal......
  • Golang 配置代理
    通过 goget 命令下载各种依赖时,经常需要访问github/google等网站。配置好代理后,可以快速稳定的访问。常用的go代理goproxyhttps://goproxy.io/zh/阿里云https://mirrors.aliyun.com/goproxy/七牛云https://goproxy.cn设置go代理go1.13及以上版本可以直接用下面......
  • 性能测试-第01天-从理解到体验,最后能够对比说出Loadrunner和JMeter的优缺点
    更多功能测试以及全套学习路线图均在专栏,↑↑戳进去领取~系列文章目录......