Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试

前置知识

SpringCloud 是微服务解决框架,主要应用在RPC远程调用。
2、里面集成了Eureka注册中心、Ribbon负载均衡客户端、Zuul接口网关
	分布式配置中心。
3、SpringCloud客户端调用工具、rest、fegin。
4、SpringCloud断路器Hystrix服务降级、熔断机制、限流。

其实总结高并发就一句话:通过负载均衡达和反向代理达到分流、通过限流达到防服务雪崩、通过服务降级达到部分故障服务依旧可用、通过隔离达到当某些服务故障不影响到其他服务、通过设置超时时间与重试机制达到防止请求堆积

一、使用Fegin客户端调用工具

	pom.xml导入

  4.0.0
  com.leeue
  41_service-order-fegin
  0.0.1-SNAPSHOT
  
  
		org.springframework.boot
		spring-boot-starter-parent
		1.5.2.RELEASE
		 
	

	
		UTF-8
		UTF-8
		1.8
	

	
		
			org.springframework.cloud
			spring-cloud-starter-eureka
		
		
			org.springframework.cloud
			spring-cloud-starter-ribbon
		
		
			org.springframework.boot
			spring-boot-starter-web
		
		
			org.springframework.cloud
			spring-cloud-starter-feign
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	

	
		
			
				org.springframework.cloud
				spring-cloud-dependencies
				Dalston.RC1
				pom
				import
			
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

	
		
			spring-milestones
			Spring Milestones
			https://repo.spring.io/milestone
			
				false
			
		
	
  

MemberFegin.java    fegin调用service
package com.leeue.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @classDesc: 功能描述:(使用fegin来调用接口)
 * @author:李月
 * @Version:v1.0
 * @createTime:2018年11月11日 下午7:28:19
 */
@FeignClient(value="service-member") // 这上面value值写你要调用的服务名称
public interface MemberFegin {

	@RequestMapping("/getMemberAll") // 这上面写你要调用的服务的接口地址 也就是service-member服务立马的Mapping
	public List getToOrderMemberAll();
	
	//Fegin底层也是会发出HttpClient请求来进行调用service-member服务地址
}

OrderFeginController.java   控制层
package com.leeue.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.leeue.service.MemberFegin;

@RestController
public class OrderFeginController {
	
	@Autowired
	private MemberFegin memberFegin;
	@RequestMapping("/getToOrderMemberAll")
	public List getToOrderMemberAll(){
		System.out.println("order fegin 工程调用 member工程");
		return memberFegin.getToOrderMemberAll();
	}
}

application.yml文件
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8888/eureka/
server:
  port: 8765
spring:
  application:
    name: service-order-fegin
OrderFegin.java
package com.leeue;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients   // 使用Fegin来调用服务 要在启动类上加上这个注解
public class OrderFegin {
	
	public static void main(String[] args) {
		SpringApplication.run(OrderFegin.class, args);
	}
}
调用链接:http://localhost:8765/getToOrderMemberAll

要注意的是fegin里面是自带负载均衡的。路由策略是轮训机制

二、服务雪崩效应产生原因

什么是服务雪崩效应?
答:雪崩效应,所有的请求在处理一个服务,这个时候
就会产生服务堆积,就不能进行访问改服务的其他接口了。
解决方案:
1、使用超时机制、服务降级()
	服务降级:就是在服务调用接口的时候如果发生错误或者超时的情况下,
	就不让其调用接口,调用本地的fallback,返回服务错误,或者服务请求过多这种提示。

三、模拟服务雪崩效应操作使用Jmeter来模拟

Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第1张图片

Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第2张图片
Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第3张图片

Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第4张图片

Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第5张图片
Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第6张图片

Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第7张图片
Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第8张图片

Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第9张图片


四、解决雪崩效应的方法

服务雪崩产生原因:是因为服务产生了堆积,导致了该服务的其他接口无法被调用。
如何解决服务雪崩效应?
1、设置超时机制 --- 如果订单服务调用会员服务接口没有在 规定的时间响应回	
      来就返回给客户端说连接超时等消息
 2、使用服务降级:服务接口发生错误的时候,不去调用接口,调用本地方法。
 	  在SpringCloud 中是 fallback。本地方法。给客户端一个反馈结果:
 	  当前访问人数过多请稍后重试等消息。
 3、熔断机制:类似保险丝。--- 一旦达到了规定请求数量、就熔断报错  
    -- 服务降级类似
 4、使用服务的隔离机制 --- 每个服务接口都把隔离开来。
 A接口
 	自己有独立的线程池、
 B接口
 	线程池  在A接口有大量访问的时候不影响B接口的访问。
 5、服务的限流机制。
 	使用网关zuul 或 nginx来做 接口达到一定次数的时候 就返回错误。

五、使用SpringCloud中Hystrix实现服务的降级

Hystrix 断路器:当我们使用rpc远程调用的时候,解决服务雪崩效应。
hystrix是专门解决服务与服务之间的报错信息。
hystrix:断路器,里面有服务降级、熔断机制、服务隔离。

在使用hystrix项目中pom.xml文件加入

	org.springframework.cloud
	spring-cloud-starter-hystrix

application.yml文件
# 开启hystrix 断路器
feign:
  hystrix:
     enabled: true
启动OrderFegin这个服务 

Java架构学习(四十一)SpringCloud&基础回顾&使用Fegin客户端调用&服务雪崩效应产生原因&Jmeter模拟服务雪崩效应&解决雪崩效应办法&Hystrix解决雪崩效应&相关面试_第10张图片

	再次访问的时候就就没有转圈,而是直接抛出服务异常这种。
	在SpringCloud中默认服务之间调用服务要在1秒内返回结果。
	这里是要3秒才能返回结果,所以hystrix进行了服务的降级
	这里使用了服务降级。

在application.yml设置超时时间。
###超时时间
hystrix:
   command: 
     default: 
       execution: 
        isolation:
         thread: 
          timeoutInMilliseconds: 4000
	超时时间在5-10秒之间

解决代码:
package com.leeue.fallback;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Component;

import com.leeue.service.MemberFegin;

/**
 * @classDesc: 功能描述:(使用hystrix 断路器做的服务降级)
 * @author:李月
 * @Version:v1.0
 * @createTime:2018年11月14日 上午11:50:51
 */
@Component //注入到Spring容器里面去
public class MemberFallBack implements MemberFegin{

	/**
	 * 对 getToOrderMemberAll这个接口进行服务降级处理
	 */
	// 这个是讲课的例子  在公司里面 不是返回类型是 String的
	@Override
	public List getToOrderMemberAll() {
		//做服务的降级处理
		List list = new ArrayList();
		list.add("服务发生异常....当前不能访问");
		return list;
	}

}
package com.leeue.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

import com.leeue.fallback.MemberFallBack;

/**
 * @classDesc: 功能描述:(使用fegin来调用接口)
 * @author:李月
 * @Version:v1.0
 * @createTime:2018年11月11日 下午7:28:19
 */
@FeignClient(value="service-member",fallback=MemberFallBack.class) // 这上面value值写你要调用的服务名称
public interface MemberFegin {

	@RequestMapping("/getMemberAll") // 这上面写你要调用的服务的接口地址 也就是service-member服务立马的Mapping
	public List getToOrderMemberAll();
	
	//Fegin底层也是会发出HttpClient请求来进行调用service-member服务地址
}

六、使用hystrix解决服务雪崩效应

	上面是fegin  调用解决雪崩效应,使用的是服务降级

七、SpringCloud相关面试

1、微服务情况下,怎么解决服务雪崩效应。
答:使用hystrix、服务降级、服务隔离、使用网关限流
2、SpringCloud与SpringBoot区别
答:SpringBoot解决的问题是,能快速集成第三方框架,
简化xml配置,自带容器,默认集成web组件springMVC
SpringCloud微服务解决框架依赖与SpringBoot.
使用SpringMVC作为RPC调用框架书写接口。

有A服务 B服务 怎么让B 服务只能让A服务访问
解决方案:
在微服务里面使用接口网关 来判断接口请求来源是那个服务
底层原理是判断http请求来源

你可能感兴趣的:(Java架构基础学习一)