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

前置知识

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

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

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

	pom.xml导入
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.leeue</groupId>
  <artifactId>41_service-order-fegin</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.RC1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
  
</project>
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:<a href="leeue@foxmail.com">李月</a>
 * @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<String> 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<String> 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来模拟

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


四、解决雪崩效应的方法

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

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

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

在使用hystrix项目中pom.xml文件加入
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
application.yml文件
# 开启hystrix 断路器
feign:
  hystrix:
     enabled: true
启动OrderFegin这个服务 

在这里插入图片描述

	再次访问的时候就就没有转圈,而是直接抛出服务异常这种。
	在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:<a href="leeue@foxmail.com">李月</a>
 * @Version:v1.0
 * @createTime:2018年11月14日 上午11:50:51
 */
@Component //注入到Spring容器里面去
public class MemberFallBack implements MemberFegin{

	/**
	 * 对 getToOrderMemberAll这个接口进行服务降级处理
	 */
	// 这个是讲课的例子  在公司里面 不是返回类型是 String的
	@Override
	public List<String> getToOrderMemberAll() {
		//做服务的降级处理
		List<String> list = new ArrayList<String>();
		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:<a href="leeue@foxmail.com">李月</a>
 * @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<String> 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请求来源

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值