up:: 利用Ribbon实现负载均衡

说明: 本来只是用户服务的问题,最后请求全部积压住,系统就会崩溃,导致其它所有服务都不可用,也不利于维护

假如用户服务出问题了,我们不希望让整个系统都崩溃掉,那我们就可以采取一些降级的手段,这样的话呢,虽然不能够返回正确的数据,但是至少能够保证有个返回能够让这个请求的得到处理,不至于说让大家排队排的越来越长,那就像我们这边一样,假设我的用户服务是可以降级的,我们返回的,那是一个默认的用户,这个用户里面的没有订单就是相当于是没有登录的一个情况,虽然我们没有办法获取到用户的信息,但是知道你能够保证商品可以正常浏览,所以这个它主要不是起到一个正向的作用,而是在发生问题的时候呢,作为保护伞的存在,保证这个错误不会扩散开来,这就是它的一个核心的作用

编码引入

除了正常的加依赖,加配置,加注解外,我们需要引入一个断路的类,出问题时就访问这个类,作为备用。。。

那我们在哪个模块添加断路嘞?price模块无法保证list模块是否正常启用,所以我们给price添加上断路类,让其调用list失败时调用这个类。。。

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

添加配置

feign.hystrix.enabled=true

启动类加注解

调用错误时选择断路类

新建断路类,实现接口

package com.imooc.course.client;
 
import com.imooc.course.entity.Course;
import org.springframework.stereotype.Component;
 
import java.util.ArrayList;
import java.util.List;
 
@Component
public class CourseListClientHystrix implements CourseListClient {
    @Override
    public List<Course> courseList() {
        List<Course> defaultCourse = new ArrayList<>();
        Course course = new Course();
        course.setId(1);
        course.setCourseId(1);
        course.setCourseName("默认课程");
        course.setValid(1);
        defaultCourse.add(course);
        return defaultCourse;
    }
}

说明: 这里使用了@component注解,请参考复习@Component注解

@Controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层

@Service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理

@Repository(实现dao访问) 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件

@Component (把普通pojo实例化到spring容器中,相当于配置文件中的 )

泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。 注意: 这个注解是注册到spring容器的意思,默认走的是无参构造,你加了有参构造,无参构造就没了,需要你显示声明无参;如果你要注册带参数的bean用configuration注解加bean注解来实现


@Primary注解

上面有误,应该是选择courselist,因为两个类继承courseListClient接口,有两个courselist方法,忘记的回头看看代码。。。

如果向消除爆红该怎么办? 使用@Primary注解,表示默认选择哪个类

测试!

正常情况

关闭course-list模块,演示出错情况