微服务架构整理-(八、SpringCloud实战之Hystrix [1])_应用未采用注册中心机制 还算微服务架构吗(1)

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

在启动类中使用 @EnableCircuitBreaker 注解开启断路器功能

@SpringBootApplication
// 激活EurekaClient
@EnableEurekaClient
//激活Hystrix
@EnableCircuitBreaker
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

添加熔断机制

在服务消费者的方法上添加注解@HystrixCommand(fallbackMethod="handleTimeout"),其中fallbackMethod中指定的是服务降级后处理的函数。当在指定的时间里没有响应时,便会回调handle函数。响应时间默认为1000ms,可以通过commandProperties来指定,例如将响应时间设为1500ms,@HystrixCommand(fallbackMethod = "handleTimeout",commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "1500") })

    @GetMapping(value = "/buy/{id}")
    //@HystrixCommand(fallbackMethod = "handleTimeout")
    @HystrixCommand(fallbackMethod = "handleTimeout",commandProperties = {
        @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })
    public Product findById(@PathVariable Long id) {
        Product product = null;
        URI uri = null;
        try {
            uri = new URI("http://service-product/product/" + id);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        //这里故意弄一个超时,强迫其服务降级
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        product = restTemplate.getForObject(uri, Product.class);
        return product;
    }

服务降级

有两种情况可以导致服务降级,一种是调用服务时超时,另一种是调用服务时抛出异常。

超时

调用服务提供者的方法超时时,Hystrix机制便会进行服务降级,通过回调@HystrixCommand中fallbackMethod指定的函数来进行降级,这种方法虽然得不到用户想要的结果,但保证了服务的可用性,不至于造成雪崩现象。这里需要注意此函数的返回值以及参数列表需要与添加熔断的方法保持一致。接上面的代码,这里给出handleTimeout方法。

    public Product handle(Long id) {
        Product product = new Product();
        product.setId(0L);
        product.setName("A fake product");
        product.setPrice(new BigDecimal(0));
        return product;
    }

运行结果 :

{
    "id": 0,
    "name": "A fake product",
    "price": 0
}

注意:超时不管发生在服务调用方,还是服务提供者方都会进行服务降级。针对上面的两段代码,在服务消费者的方法findById上添加的熔断机制,findById中调用了服务提供者的方法 http://service-product/product/{id}, 不管在哪个方法中发生了超时,都会回调handleTimeout方法。

异常

当调用服务时发生了异常,默认情况下也是回调服务降级函数,如果在发生异常时不想进行服务降级,可以在@HystrixCommand添加ignoreExceptions = Exception.class 。例如:
异常服务降级

 	@GetMapping(value = "/buy1/{id}/{price}")
    @HystrixCommand(fallbackMethod = "handleException")
    public Product findByIdAndPrice1(@PathVariable Long id, @PathVariable BigDecimal price) {
        Product product = null;
        // 这里故意弄一个运行时异常超时,强迫其服务降级
        int i = 1 / 0;

        product = restTemplate.getForObject("http://service-product/product/{1}/{2}", Product.class, id, price);
        return product;
    }

    public Product handleException(Long id, BigDecimal price, Throwable throwable) {
        Product product = new Product();
        product.setId(0L);
        product.setName(throwable.getMessage());
        product.setPrice(new BigDecimal(0));
        return product;
    }

运行结果:

{
    "id": 0,
    "name": "/ by zero",
    "price": 0
}

异常服务不降级
当将注解改成:@HystrixCommand(fallbackMethod = "handleException", ignoreExceptions = Exception.class)时,最终的运行结果为:

{
    "timestamp": "2022-05-24T14:57:00.759+0000",
    "status": 500,


### 最后

> **面试题文档来啦,内容很多,485页!**
>
> **由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。**

# 1111道Java工程师必问面试题

![](https://img-blog.csdnimg.cn/img_convert/f8935a95a3f0036dee7816a0aae0e1a5.webp?x-oss-process=image/format,png)

**MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:**

![](https://img-blog.csdnimg.cn/img_convert/d3a9fdd1cba1966bae0f0d1e8bcd0132.webp?x-oss-process=image/format,png)

**Elasticsearch 24 题 +Memcached +** **Redis 40题:**

![](https://img-blog.csdnimg.cn/img_convert/b87bce86a1a1b792525d70495e418b28.webp?x-oss-process=image/format,png)

**Spring 26 题+ 微服务 27题+ Linux 45题:**

![](https://img-blog.csdnimg.cn/img_convert/ee9d8d28e9a89ec95210673817c7d115.webp?x-oss-process=image/format,png)

**Java面试题合集:**

![](https://img-blog.csdnimg.cn/img_convert/798cb68057e90b34b34c81e87ad50baf.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

va面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值