从头开始,负载均衡原理

作者: 新金沙平台  发布:2019-09-27

RestTemplate负载均衡原理

.NET中提供了读写Cookie的多种方法,Request.Cookies 是客户端通过 Cookie 标头形式由客户端传输到服务器的 Cookie;Response.Cookies 在服务器上创建并以 Set-Cookie 标头的形式传输到客户端。也就是说,一个是客户端向服务器端发送的来的,一个是服务器发送到客户端的。

一、switch

RestTemplate为什么具有负载均衡的功能?

第一次创建Cookies的时候,下面的2种读取方法读取到的内容是一样:

1.根据输入月份获取季节

在使用了@LoadBalanced后,Spring容器在启动的时候会为被修饰过的RestTemplate添加拦截器,拦截器里会使用LoadBalanced相关的负载均衡接口来处理请求,通过这样一个间接的处理,会使原来的RestTemplate变得不是原来的RestTemplate了,就变的更NB了,因此具备了负载均衡的功能。
那么在这章的内容中呢,笔者将带大家实现一个很简单的LoadBalanced注解,为RestTemplate添加拦截器的这么一个过程,至于如何在拦截器中实现负载均衡的功能,这个还需探索。。。(如果各位道友知道如何实现,请告知一二,先感谢了)

C# 代码
HttpCookie hc = new HttpCookie;
hc["UserName"] = "mengxianhui";
Response.Cookies.Add;

import java.util.*;class Demo8{    public static void main(String[] args)    {        System.out.println("请输入一个月份:");        //创建一个扫描器        Scanner scanner=new Scanner(System.in);        //调用扫描器的nex    Int方法        int moonth=scanner.nextInt();        switch        {            case 3:            case 4:            case 5: System.out.println("春天");                    break;            case 6:             case 7:            case 8: System.out.println("夏天");                    break;            case 9:             case 10:            case 11:System.out.println("秋天");                    break;               case 12:             case 1:            case 2: System.out.println("冬天");                    break;                 default:System.out.println("没有对应的季节");                    break;          }    }}

引入web依赖:pom.xml

Response.Cookies["User1"]["UserId"] = "net_lover";

2.如果编译出错

<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>        <version>2.0.3.RELEASE</version>    </dependency></dependencies>

Response.Write(Request.Cookies["User1"].Values["UserId"].ToString;
Response.Write(Request.Cookies["User2"].Values["UserName"].ToString;
Response.Write("<hr>");
Response.Write(Response.Cookies["User1"].Values["UserId"].ToString;
Response.Write(Response.Cookies["User2"].Values["UserName"].ToString;
但是,一旦Cookie存在,再使用上面的方法进行读取,结果是有差别的,Response.Cookies可以立即读取到新的Cookie,而Request.Cookies读取到仍是上一次设置的,也就是必须通过客户端向服务器发送请求时才能读取到。为什么会有这样的差别,应该是.NET实现的问题,里面有这么一段:
C# 代码
if (includeResponse && (this.Response != null))
{
HttpCookieCollection cookies = this.Response.Cookies;
if (cookies.Count > 0)
{
HttpCookie[] dest = new HttpCookie[cookies.Count];
cookies.CopyTo;
for (int i = 0; i < dest.Length; i )
{
cookieCollection.AddCookie(dest[i], true);
}
}
}
在Cookie不存在时,它应该是读取Response.Cookies里面的Cookie了,所以第一次读取相同,而以后读取不同的原因吧。

图片 1

自定义注解:MyLoadBalanced.java

另外,Response.Cookies必须是在设置完后读取,不能像Request.Cookies那样随时读取,如在别的页面读取Cookies,下面的方法就是错误的

需要这样编译才能成功

/** * 修饰:域、参数、方法 */@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})/** * 作用是定义被它所注解的注解保留多久,一共有三种策略,定义在RetentionPolicy枚举中 * 1. SOURCE:被编译器忽略 * 2. CLASS:注解将会被保留在Class文件中,但在运行时并不会被VM保留。这是默认行为,所有没有用Retention注解的注解,都会采用这种策略 * 3. RUNTIME:保留至运行时。所以我们可以通过反射去获取注解信息。 */@Retention(RetentionPolicy.RUNTIME)/** * 限定注解 */@Qualifierpublic @interface MyLoadBalanced {}

C# 代码
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Response.Cookies["User1"].Values["UserId"].ToString;
Response.Write(Response.Cookies["User2"].Values["UserName"].ToString;
}

图片 2

创建Controller:MyController.java

图片 3

@RestController
@Configurationpublic class MyController {    @Bean  // 将getRestTemplate修饰为Bean,交给spring管理    @MyLoadBalanced  // 这里使用刚刚自定义的注解    public RestTemplate getRestTemplate(){        return new RestTemplate();    }}

图片 4

创建配置类:Config.java

二、while

@Configurationpublic class Config {        @Autowired(required = false)// 非必须的,将那些被@MyLoadBalanced注解修饰过的对象,自动装配到tpls集合中    @MyLoadBalanced    private List<RestTemplate> tpls = Collections.emptyList();        // 在spring容器启动之后,需要对每一个RestTemplate都要设置一个拦截器,拦截器里面会实现负载均衡的功能    @Bean    public SmartInitializingSingleton lbInitializing(){        return new SmartInitializingSingleton() {            @Override            public void afterSingletonsInstantiated() {                System.out.println("RestTemplate集合大小:" tpls.size;            }        };    }}

1.求1-100中7的倍数总和

下面我们创建一个启动类,看一看到底有没有自动装配成功:Application.java

import java.util.*;class Demo9{    public static void main(String[] args)    {        int num=0;        int sum=0;        while(num<=100)        {            if(num%7==0)            {                sum =num;            }            num  ;        }        System.out.println;    }}

本文由新金沙平台发布于新金沙平台,转载请注明出处:从头开始,负载均衡原理

关键词: 新金沙平台 4166am金沙

上一篇:代码执行和生命周期,常用正则表达式
下一篇:没有了