SpringCloud 是微服务解决框架,主要应用在RPC远程调用。
2、里面集成了Eureka注册中心、Ribbon负载均衡客户端、Zuul接口网关
分布式配置中心。
3、SpringCloud客户端调用工具、rest、fegin。
4、SpringCloud断路器Hystrix服务降级、熔断机制、限流。
其实总结高并发就一句话:通过负载均衡达和反向代理达到分流、通过限流达到防服务雪崩、通过服务降级达到部分故障服务依旧可用、通过隔离达到当某些服务故障不影响到其他服务、通过设置超时时间与重试机制达到防止请求堆积
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,返回服务错误,或者服务请求过多这种提示。
服务雪崩产生原因:是因为服务产生了堆积,导致了该服务的其他接口无法被调用。
如何解决服务雪崩效应?
1、设置超时机制 --- 如果订单服务调用会员服务接口没有在 规定的时间响应回
来就返回给客户端说连接超时等消息
2、使用服务降级:服务接口发生错误的时候,不去调用接口,调用本地方法。
在SpringCloud 中是 fallback。本地方法。给客户端一个反馈结果:
当前访问人数过多请稍后重试等消息。
3、熔断机制:类似保险丝。--- 一旦达到了规定请求数量、就熔断报错
-- 服务降级类似
4、使用服务的隔离机制 --- 每个服务接口都把隔离开来。
A接口
自己有独立的线程池、
B接口
线程池 在A接口有大量访问的时候不影响B接口的访问。
5、服务的限流机制。
使用网关zuul 或 nginx来做 接口达到一定次数的时候 就返回错误。
Hystrix 断路器:当我们使用rpc远程调用的时候,解决服务雪崩效应。
hystrix是专门解决服务与服务之间的报错信息。
hystrix:断路器,里面有服务降级、熔断机制、服务隔离。
在使用hystrix项目中pom.xml文件加入
org.springframework.cloud
spring-cloud-starter-hystrix
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:李月
* @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服务地址
}
上面是fegin 调用解决雪崩效应,使用的是服务降级
1、微服务情况下,怎么解决服务雪崩效应。
答:使用hystrix、服务降级、服务隔离、使用网关限流
2、SpringCloud与SpringBoot区别
答:SpringBoot解决的问题是,能快速集成第三方框架,
简化xml配置,自带容器,默认集成web组件springMVC
SpringCloud微服务解决框架依赖与SpringBoot.
使用SpringMVC作为RPC调用框架书写接口。
有A服务 B服务 怎么让B 服务只能让A服务访问
解决方案:
在微服务里面使用接口网关 来判断接口请求来源是那个服务
底层原理是判断http请求来源