-
zuul:
nginx和zuul是可以配合使用的,使用nginx作为负载均衡实现高并发的请求转发,Zuul用作网关,进行权限校验,限流等功能(ribbon是对微服务之间调用做负载均衡,zuul是对外部请求做负载均衡)
zuul通过RequestContext来对request和response进行处理,有四种过滤器:
PRE(请求执行之前),ROUTING(处理请求, 进行路由),POST(请求处理完成后执行), ERROR(出现错误时执行). -
Hystrix会建立很多个小小的线程池,比如订单服务请求库存服务是一个线程池,请求仓储服务是一个线程池,请求积分服务是一个线程池。每个线程池里的线程就仅仅用于请求那个服务。防止某个微服务模块异常导致其他模块受到影响(某一个服务挂了,就会引起连锁反应,导致别的服务也挂。比如积分服务挂了,会导致订单服务的线程全部卡在请求积分服务这里,没有一个线程可以工作,瞬间导致订单服务也挂了).
-
Feign:
Feign和Httpclient,RestTemplate等都可以发出http请求实现对Api的调用.但feign更简洁方便,同时Feign默认使用了ribbon进行负载均衡,默认的是随机的策略,如果想要更改策略,需要修改@FeignClient文件所在模块中yml的配置.
"product"服务(服务提供者)下:
– Client文件:
*/
@FeignClient(name = "product") //代表提供服务的模块名
public interface ProductClient {
@PostMapping("/product/listForOrder") //在消费者服务层调用此方法,FeignClient再对"product"发出对应的http请求
// 来实现对"product"服务提供者模块的访问
List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList);
@PostMapping("/product/decreaseStock")
void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList);
}
– controller文件:
@RestController
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductService productService;
/**
* 获取商品列表(给订单服务用的)
* @param productIdList
* @return
*/
@PostMapping("/listForOrder")
public List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList) {
return productService.findList(productIdList);
}
@PostMapping("/decreaseStock")
public void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList) {
productService.decreaseStock(decreaseStockInputList);
}
}
"order"服务(消费者)下:
– service文件:
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private ProductClient productClient;
public List<ProductInfoOutput> fun1(List<String> productIdList) {
//通过调用添加FeignClient注解的接口中的方法实现了对其Api的访问
return productClient.listForOrder(productIdList);
}
public void fun2(List<DecreaseStockInput> decreaseStockInputList) {
productClient.decreaseStock(decreaseStockInputList);
}
- Ribbon
Ribbon和RestTemplate结合起来实现负载均衡,