3分飞艇概率_Hystrix针对不可用服务的保护机制以及引入缓存

  • 时间:
  • 浏览:1
  • 来源:GZ资源网 - 专注共享维森博客资讯

   前一天 我写过一篇博文,通过案例了解Hystrix的各种基本使用法律法律法律依据,在这篇文章里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 是通过Hystrix调用正常工作的服务,也可是我我说,Hytrix的保护机制并越来越起作用,这里我们歌词 歌词 歌词 我们歌词 歌词 歌词 将在HystrixProtectDemo.java里演示调用不可用的服务时,hystrix启动保护机制的流程。你你这名 类是基于NormalHystrixDemo.java改写的,可是我我在其中增加了getFallback法律法律法律依据,代码如下。     

1	//省略必要的package和import代码
2	public class HystrixProtectDemo extends HystrixCommand<String> {
3		RestClient client = null;
4		HttpRequest request = null;
5	    //构造函数很类式
6		public HystrixDemoProtectDemo() {
7		super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
8		}
9	   //initRestClient法律法律法律依据没变
10		private void initRestClient(){
11	        //和NormalHystrixDemo.java一样,具体请参考代码
12		}
13		//run法律法律法律依据也没变
14		protected String run() {
15			//和NormalHystrixDemo.java一样,具体请参考代码
16		}
17	    //这次多个了getFallback法律法律法律依据,一旦出错,会调用其中的代码
18		protected String getFallback() {
19			//省略跳转到错误提示页面的动作
20			return "Call Unavailable Service.";
21		}
22		//main函数
23		public static void main(String[] args) {
24			HystrixDemoProtectDemo normalDemo = new HystrixDemoProtectDemo();
25			normalDemo.initRestClient();
26			try {
27				Thread.sleep(60

0);
28			} catch (InterruptedException e) {
29				e.printStackTrace();
60

			}           
31			String result = normalDemo.execute();
32			System.out.println("Call available function, result is:" + result);
33		}
34	}

    你你这名 类里的构造函数和NormalHystrixDemo.java很类式,而initRestClient和run法律法律法律依据根本没变,不多就不再删剪给出了。

    在第18行里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 重写了HystrixCommand类的getFallback法律法律法律依据,在其中定义了一旦访问出错的动作,这里仅仅是输出语句,在实际的项目里,都并能 跳转到相应的错误提示页面。

    而main函数里的代码和NormalHystrixDemo.java里的删剪一样,可是我我,在运行这段代码前我不多 运行HystrixServerDemo项目的启动类,另三个白 服务一定是调用越来越的。运行本段代码后,我们歌词 歌词 歌词 我们歌词 歌词 歌词 能看后如下的结果。  

             In run

             Call available function, result is:Call Unavailable Service.

    从第2行的输出上,我们歌词 歌词 歌词 我们歌词 歌词 歌词 能确认,一旦调用服务出错,Hystrix补救类能自动地调用getFallback法律法律法律依据。

    前一天 这里越来越定义getFallback法律法律法律依据,越来越一旦服务不可用,越来越用户前一天 在连接超时前一天 ,在浏览器里看后一串毫无意义的内容,另三个白 用户体验就很差,前一天 整个系统的其它容错法律法律法律依据也没到位,甚至就有前一天 导致 当前和下游模块瘫痪。

    相反,在这里前一天 我们歌词 歌词 歌词 我们歌词 歌词 歌词 在hystirx提供的getFallback法律法律法律依据里做了充分的准备,越来越一旦跳出 错误,这段错误补救的代码能被立即触发,其效果就至少熔断后继的补救流程。

    由getFallback出面,友好地告知用户出问題了,以及后继该怎么能不能补救,另三个白 一方面能及时熔断请求从而保护整个系统,本人面我不多 造成因体验过差而用户大规模流失的情况汇报。

    前一天 每次请求就有走后台应用tcp连接乃至再到数据库检索一下数据,这对服务器的压力不多,有前一天 你你这名 因素甚至会成为影响网站服务性能的瓶颈。不多,大多数网站会把可是我我 我不多 实时更新的数据中放去缓存,前端请求是到缓存里拿数据。    

    Hystrix在提供保护性便利的一块儿,并能支持缓存的功能,在下面的HystrixCacheDemo.java里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 将演示Hystrix从缓存中读取数据的步骤,代码如下。     

1    //省略必要的package和import代码
2    public class HystrixCacheDemo extends HystrixCommand<String> {
3        //用户id
4        Integer id;
5         //用三个白



HashMap来模拟数据库里的数据
6        private HashMap<Integer,String> userList = new HashMap<Integer,String>();
7        //构造函数
8        public HystrixCacheDemo(Integer id) {
9        super(HystrixCommandGroupKey.Factory.asKey("RequestCacheCommand"));        
10            this.id = id;
11            userList.put(1, "Tom");
12        }

    在第3行里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 定义了三个白 用户id,并在第6行定义了三个白 存放用户信息的HashMap。

    在第8行的构造函数里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 在第10行里用参数id来初始化了本对象的id属性,并在第11行里,通过put法律法律法律依据模拟地构建了三个白 用户,在项目里,用户的信息着实是处于数据库里的。    

13        protected String run() {
14            System.out.println("In run");
15            return userList.get(id);
16        }

    前一天 不走缓存语句,第13行定义run函数前一天 被execute法律法律法律依据触发,在其中的第15行里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 通过get法律法律法律依据从userList你你这名 HashMap里获得一根用户数据,这里我们歌词 歌词 歌词 我们歌词 歌词 歌词 用get法律法律法律依据来模拟根据id从数据库里获取数据的诸多动作。    

17		protected String getCacheKey() {
18			return String.valueOf(id);
19		}

  第17行定义的getCacheKey法律法律法律依据是Hystrix实现缓存的关键,在其中我们歌词 歌词 歌词 我们歌词 歌词 歌词 都并能 定义“缓存对象的标准”,具体而言,我们歌词 歌词 歌词 我们歌词 歌词 歌词 在这里是返回String.valueOf(id),也可是我我说,前一天 第三个白HystrixCacheDemo对象和第三个白 对象具有相同的String.valueOf(id)的值,越来越第三个白对象在调用execute法律法律法律依据时,就都并能 走缓存。

public static void main(String[] args) {        
21         //初始化上下文,可是我我无法用缓存机制
22            HystrixRequestContext context = HystrixRequestContext.initializeContext();
23            //定义三个白



具有相同id的对象
24            HystrixCacheDemo cacheDemo1 = new HystrixCacheDemo(1);
25            HystrixCacheDemo cacheDemo2 = new HystrixCacheDemo(1);
26            //第三个白



对象调用的是run法律法律法律依据,越来越走缓存    
27            System.out.println("the result for cacheDemo1 is:" + cacheDemo1.execute());
28            System.out.println("whether get from cache:" + cacheDemo1.isResponseFromCache);
29            //第三个白对象,前一天

和第三个白



对象具有相同的id,不多走缓存    
60

            System.out.println("the result for cacheDemo2 is:" + cacheDemo2.execute());
31            System.out.println("whether get from cache:" + cacheDemo2.isResponseFromCache);
32            //销魂上下文,以清空缓存
33            context.shutdown();
34            //再次初始化上下文,但前一天

缓存已清,不多cacheDemo3没走缓存
35            context = HystrixRequestContext.initializeContext();
36            HystrixCacheDemo cacheDemo3 = new HystrixCacheDemo(1);
37            System.out.println("the result for 3 is:" + cacheDemo3.execute());
38            System.out.println("whether get from cache:" + cacheDemo3.isResponseFromCache);
39            context.shutdown();

    在第20行的main法律法律法律依据里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 定义了如下的主要逻辑。

    第一,在第22行,通过initializeContext法律法律法律依据,初始化了上下文,另三个白 并能启动缓存机制。,在第24和25行里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 创建了三个白 不同名的,但相同id的HystrixCacheDemo对象。

    第二,在第27行里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 通过cacheDemo1对象的execute法律法律法律依据,根据id查找用户,着实我们歌词 歌词 歌词 我们歌词 歌词 歌词 在这里是通过run法律法律法律依据里第15行的get法律法律法律依据从HashMap里取数据,但我们歌词 歌词 歌词 我们歌词 歌词 歌词 都并能 把这想象成从数据表里取数据。

    第三,在第60 行里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 调用了cacheDemo2对象的execute法律法律法律依据,前一天 它和cacheDemo1对象具有相同的id,不多这里并越来越走execute法律法律法律依据,可是我我直接从保存cacheDemo1.execute的缓存里拿数据,这就都并能 补救因多次访问数据库而造成了系统损耗。

    第四,我们歌词 歌词 歌词 我们歌词 歌词 歌词 在第33行销毁了上下文,并在第35行里重新初始化了上下文,前一天 ,着实在第36行定义的cacheDemo3对象的id依然是1,但前一天 上下文对象被重置过,其中的缓存也被清空,不多在第37里执行的execute法律法律法律依据并越来越走缓存。

    运行上述代码,我们歌词 歌词 歌词 我们歌词 歌词 歌词 能看后如下的输出,那些打印结果能很好地验证上述对主要流程的说明。    

1    In run
2    the result for cacheDemo1 is:Tom
3    whether get from cache:false
4    the result for cacheDemo2 is:Tom
5    whether get from cache:true
6    In run
7    the result for 3 is:Tom

    这里请我们歌词 歌词 歌词 我们歌词 歌词 歌词 注意,在缓存相关的getCacheKey法律法律法律依据里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 就有定义“保存缓存值”的逻辑,可是我我定义“缓存对象的标准”,初学者三个白 劲会混淆这点。具体而言,在这里的getCacheKey法律法律法律依据里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 并越来越保存id是1的User对象的值(这里是Tom),可是我我定义了如下的标准:可是我我三个白 (或多个)HystrixCacheDemo对象具有相同的String.valueOf(id)的值,可是我我缓存中也前一天 存有id的1的结果值,越来越后继对象则都并能 直接从缓存里读数据。

    在上文里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 演示了通过Hystrix调用可用以及不可用服务的运行结果,并在调用过程中引入了缓存机制,这里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 将在上述案例的基础上归纳Hystrix的一般工作流程。

    第一,我们歌词 歌词 歌词 我们歌词 歌词 歌词 都并能 通过extends HystrixCommand<T>的法律法律法律依据,让三个白 类具备Hystrix保护机制的价值形式,其中T是泛型,在上述案例中我们歌词 歌词 歌词 我们歌词 歌词 歌词 用到的是String。

    第二,一旦继承了HystrixCommand前一天 ,我们歌词 歌词 歌词 我们歌词 歌词 歌词 就都并能 通过重写run法律法律法律依据和getFallback法律法律法律依据来定义调用“可用”和“不可用”服务的业务功能代码,其中,这三个白 法律法律法律依据的返回值需用和第一步里定义的泛型T一致。而在项目里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 一般在getFallback法律法律法律依据里,定义“服务不可用”时的保护法律法律法律依据(也可是我我后文里将要提到的降级法律法律法律依据)。

    第三,我们歌词 歌词 歌词 我们歌词 歌词 歌词 还都并能 通过缓存机制来降低并发情况汇报下对服务器的压力,在Hystrix里,我们歌词 歌词 歌词 我们歌词 歌词 歌词 都并能 在getCacheKey里定义“判断都并能 走缓存对象的标准”。

    在使用缓存是,请注意两点,第一需用开启上下文,第二,Hystrix会根据定义在类里的属性判断多次调用的对象否有 同三个白 ,前一天 是,可是我我前一天 被调用过,则都并能 走缓存。

    本文谢绝转载。