教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go接口练习之负载均衡算法

Go接口练习之负载均衡算法

发布时间:2022-01-07   编辑:jiaochengji.com
教程集为您提供Go接口练习之负载均衡算法等资源,欢迎您收藏本站,我们将为您提供最新的Go接口练习之负载均衡算法资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h1>背景</h1>

Web请求中,申请服务,为了避免多个服务都集中运行在一个服务器上,于是有了负载均衡,本文撰写了随机算法和轮渡(顺序)算法

<h2>
balance包</h2>

balance.go

<pre><code class="lang-go hljs"><span class="token keyword">package</span> balance <span class="token comment">// 负载均衡接口</span> <span class="token keyword">type</span> Balance <span class="token keyword">interface</span><span class="token punctuation">{</span> <span class="token function">DoBalance</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">*</span>Instance<span class="token punctuation">,</span><span class="token operator">...</span><span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token operator">*</span>Instance<span class="token punctuation">,</span><span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

Instance.go

<pre><code class="lang-go hljs"><span class="token keyword">package</span> balance <span class="token keyword">import</span><span class="token punctuation">(</span> <span class="token string">"strconv"</span> <span class="token punctuation">)</span> <span class="token comment">// 实例:主机 端口</span> <span class="token keyword">type</span> Instance <span class="token keyword">struct</span><span class="token punctuation">{</span> host <span class="token builtin">string</span> port <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token comment">// 构造函数</span> <span class="token keyword">func</span> <span class="token function">NewInstance</span><span class="token punctuation">(</span>host <span class="token builtin">string</span><span class="token punctuation">,</span>port <span class="token builtin">int</span><span class="token punctuation">)</span><span class="token operator">*</span>Instance <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator">&</span>Instance<span class="token punctuation">{</span> host<span class="token punctuation">:</span>host<span class="token punctuation">,</span> port<span class="token punctuation">:</span>port<span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 获取主机</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Instance<span class="token punctuation">)</span><span class="token function">GetHost</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> p<span class="token punctuation">.</span>host <span class="token punctuation">}</span> <span class="token comment">// 获取端口</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Instance<span class="token punctuation">)</span><span class="token function">GetPort</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> p<span class="token punctuation">.</span>port <span class="token punctuation">}</span> <span class="token comment">// 重写打String用于打印</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Instance<span class="token punctuation">)</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> p<span class="token punctuation">.</span>host <span class="token operator"> </span> <span class="token string">":"</span> <span class="token operator"> </span> strconv<span class="token punctuation">.</span><span class="token function">Itoa</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>port<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

mgr.go

<pre><code class="lang-go hljs"><span class="token keyword">package</span> balance <span class="token keyword">import</span><span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token punctuation">)</span> <span class="token comment">// 管理员</span> <span class="token keyword">type</span> BalanceMgr <span class="token keyword">struct</span><span class="token punctuation">{</span> <span class="token comment">// 全部的负载均衡算法 都放在了map里面</span> allBalancer <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span>Balance <span class="token punctuation">}</span> <span class="token comment">// 实例化一个管理员</span> <span class="token keyword">var</span> mgr <span class="token operator">=</span> BalanceMgr<span class="token punctuation">{</span> <span class="token comment">// 初始化map</span> allBalancer<span class="token punctuation">:</span><span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span>Balance<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">// 注册一个负载均衡算法</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>BalanceMgr<span class="token punctuation">)</span><span class="token function">registerBalancer</span><span class="token punctuation">(</span>name <span class="token builtin">string</span><span class="token punctuation">,</span>b Balance<span class="token punctuation">)</span> <span class="token punctuation">{</span> p<span class="token punctuation">.</span>allBalancer<span class="token punctuation">[</span>name<span class="token punctuation">]</span> <span class="token operator">=</span> b <span class="token punctuation">}</span> <span class="token comment">// 注册一个负载均衡算法</span> <span class="token keyword">func</span> <span class="token function">RegisterBalancer</span><span class="token punctuation">(</span>name <span class="token builtin">string</span><span class="token punctuation">,</span>b Balance<span class="token punctuation">)</span> <span class="token punctuation">{</span> mgr<span class="token punctuation">.</span><span class="token function">registerBalancer</span><span class="token punctuation">(</span>name<span class="token punctuation">,</span>b<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// ???</span> <span class="token keyword">func</span> <span class="token function">DoBalance</span><span class="token punctuation">(</span>name <span class="token builtin">string</span><span class="token punctuation">,</span>insts <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">*</span>Instance<span class="token punctuation">)</span> <span class="token punctuation">(</span>inst <span class="token operator">*</span>Instance<span class="token punctuation">,</span>err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> balance<span class="token punctuation">,</span>ok<span class="token operator">:=</span>mgr<span class="token punctuation">.</span>allBalancer<span class="token punctuation">[</span>name<span class="token punctuation">]</span> <span class="token keyword">if</span> <span class="token operator">!</span>ok<span class="token punctuation">{</span> err <span class="token operator">=</span> fmt<span class="token punctuation">.</span><span class="token function">Errorf</span><span class="token punctuation">(</span><span class="token string">"Not found %s balancer"</span><span class="token punctuation">,</span>name<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"use %s balancer\n"</span><span class="token punctuation">,</span>name<span class="token punctuation">)</span> inst<span class="token punctuation">,</span>err <span class="token operator">=</span> balance<span class="token punctuation">.</span><span class="token function">DoBalance</span><span class="token punctuation">(</span>insts<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> </code></pre>

random.go

<pre><code class="lang-go hljs"><span class="token keyword">package</span> balance <span class="token keyword">import</span><span class="token punctuation">(</span> <span class="token string">"errors"</span> <span class="token string">"math/rand"</span> <span class="token punctuation">)</span> <span class="token comment">// 初始化函数 用来注册</span> <span class="token keyword">func</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">RegisterBalancer</span><span class="token punctuation">(</span><span class="token string">"random"</span><span class="token punctuation">,</span><span class="token operator">&</span>RandomBalance<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// 随机调度</span> <span class="token keyword">type</span> RandomBalance <span class="token keyword">struct</span><span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment">// 实现接口</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>RandomBalance<span class="token punctuation">)</span> <span class="token function">DoBalance</span><span class="token punctuation">(</span>insts <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">*</span>Instance<span class="token punctuation">,</span>key <span class="token operator">...</span><span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>inst <span class="token operator">*</span>Instance<span class="token punctuation">,</span>err <span class="token builtin">error</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>insts<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">{</span> err <span class="token operator">=</span> errors<span class="token punctuation">.</span><span class="token function">New</span><span class="token punctuation">(</span><span class="token string">"No Instance"</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> lens <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>insts<span class="token punctuation">)</span> index <span class="token operator">:=</span> rand<span class="token punctuation">.</span><span class="token function">Intn</span><span class="token punctuation">(</span>lens<span class="token punctuation">)</span> inst <span class="token operator">=</span>insts<span class="token punctuation">[</span>index<span class="token punctuation">]</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> </code></pre>

randrobin.go

<pre><code class="lang-go hljs"><span class="token keyword">package</span> balance <span class="token keyword">import</span><span class="token punctuation">(</span> <span class="token string">"errors"</span> <span class="token punctuation">)</span> <span class="token comment">// 初始化函数 用来注册</span> <span class="token keyword">func</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">RegisterBalancer</span><span class="token punctuation">(</span><span class="token string">"roundrobin"</span><span class="token punctuation">,</span><span class="token operator">&</span>RoundRobinBalance<span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// 顺序调度</span> <span class="token keyword">type</span> RoundRobinBalance <span class="token keyword">struct</span><span class="token punctuation">{</span> curIndex <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token comment">// 实现接口</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>RoundRobinBalance<span class="token punctuation">)</span> <span class="token function">DoBalance</span><span class="token punctuation">(</span>insts <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">*</span>Instance<span class="token punctuation">,</span>key<span class="token operator">...</span><span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>inst <span class="token operator">*</span>Instance<span class="token punctuation">,</span>err <span class="token builtin">error</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>insts<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">{</span> err <span class="token operator">=</span> errors<span class="token punctuation">.</span><span class="token function">New</span><span class="token punctuation">(</span><span class="token string">"No Instance"</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> lens <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>insts<span class="token punctuation">)</span> <span class="token keyword">if</span> p<span class="token punctuation">.</span>curIndex <span class="token operator">>=</span> lens <span class="token punctuation">{</span> p<span class="token punctuation">.</span>curIndex <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">}</span> inst <span class="token operator">=</span> insts<span class="token punctuation">[</span>p<span class="token punctuation">.</span>curIndex<span class="token punctuation">]</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> </code></pre> <h2>
入口函数</h2>

main.go

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span><span class="token punctuation">(</span> <span class="token string">"go_dev/day06/work/balance"</span> <span class="token string">"fmt"</span> <span class="token string">"time"</span> <span class="token string">"math/rand"</span> <span class="token string">"os"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> insts <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">*</span>balance<span class="token punctuation">.</span>Instance <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator"><</span><span class="token number">16</span><span class="token punctuation">;</span>i<span class="token operator"> </span><span class="token punctuation">{</span> host <span class="token operator">:=</span> fmt<span class="token punctuation">.</span><span class="token function">Sprintf</span><span class="token punctuation">(</span><span class="token string">"192.168.%d,%d"</span><span class="token punctuation">,</span>rand<span class="token punctuation">.</span><span class="token function">Intn</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">,</span>rand<span class="token punctuation">.</span><span class="token function">Intn</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">)</span> one <span class="token operator">:=</span>balance<span class="token punctuation">.</span><span class="token function">NewInstance</span><span class="token punctuation">(</span>host<span class="token punctuation">,</span><span class="token number">8080</span><span class="token punctuation">)</span> insts <span class="token operator">=</span> <span class="token function">append</span><span class="token punctuation">(</span>insts<span class="token punctuation">,</span>one<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// 根据不同配置选择不同负载均衡算法</span> <span class="token keyword">var</span> balanceName <span class="token operator">=</span> <span class="token string">"random"</span> <span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>Args<span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">{</span> balanceName <span class="token operator">=</span> os<span class="token punctuation">.</span>Args<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token comment">// 模拟请求</span> <span class="token keyword">for</span><span class="token punctuation">{</span> <span class="token comment">// 不断执行,变量覆写接口的内容</span> inst<span class="token punctuation">,</span>err<span class="token operator">:=</span>balance<span class="token punctuation">.</span><span class="token function">DoBalance</span><span class="token punctuation">(</span>balanceName<span class="token punctuation">,</span>insts<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span><span class="token boolean">nil</span><span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"do balance err:"</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span> <span class="token keyword">continue</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>inst<span class="token punctuation">)</span> time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> 到此这篇关于“Go接口练习之负载均衡算法”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
LVS调度算法和三种工作模式
Go语言微服务开发框架实践-go chassis(中篇)
Python3爬虫进阶:Splash负载均衡配置
Go接口练习之负载均衡算法
django如何解决高并发
Golang基础第五篇——golang的gRPC
Golang学习之路(二):Windows下Go Micro微服务开发环境搭建
php分布式是什么
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
想系统学习GO语言(Golang

[关闭]
~ ~