spring cloud之Feign风格服务接口搭建和服务熔断

Feign其实就是restTemplate和Ribbon的结合版本。

Feign默认负载均衡策略就是轮询方式。

创建一个接口,然后使用@FeignClient指定集群的服务名称,去修饰接口,该接口中的方法全部都使用抽象方法,然后使用@RequestMapping修饰,就可以采用像Mybatis的那种面向接口访问的方式访问了。

搭建流程:

1、导入pom依赖

<dependencies>

        <!--springboot启动默认需要的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>

        <!--springboot 支持web开发-->
        <dependency>
            <!-- 对全栈web开发的支持,包括Tomcat和 spring-webmvc -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>


        <!--spring与mybatis整合的jar-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>

        <!--让tomcat支持jsp页面-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>${tomcat.version}</version>
        </dependency>

        <!--自定义模块然后再其他模块中引用-->
        <dependency>
            <groupId>com.syzw</groupId>
            <artifactId>com.syzw.common</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!-- mybatis的框架包 -->
        <!-- mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>

        <!--连接mysql的驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>

        <!--eureka-client 客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>1.4.0.RELEASE</version>
        </dependency>

        <!--feign的依赖,feign其实就是把Ribbon和RestTemplate整合起来了,形成了一种像mytabis的dao接口层的访问方式-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>

        <!--
            配置服务的熔断和降级
        -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>

        <!--监控的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>

    </dependencies>

2、主启动类中开启Feign接口风格访问模式

/**
 * feign风格的消费者
 */
@SpringBootApplication
//因为要向eureka-server消费服务,所以自己这个服务要作为客户端
@EnableEurekaClient
//启用Feign风格的接口访问模式
@EnableFeignClients(basePackages= "com.syzw.feign.consumer")
@EnableHystrix
public class FeignConsumerAppStart {
    public static void main(String[] args) {
        SpringApplication.run(FeignConsumerAppStart.class,args);
    }
}

3、创建Feign接口风格服务

/**
 *Feign作为消费者,Feign其实就是RestTemplate+Ribbon的结合版本。
 * 因为RestTemplate不符合现在的面向接口方式定义,所以Feign就诞生了。
 *
 * SERVER1DEPTSERVER是集群的服务提供者的名称。
 *
 * fallback:就是为了解决在每个方法中需要大量的熔断注解@HystrixCommand,
 * 而产生的fallback接口。
 */
@FeignClient(name="SERVER1DEPTSERVER",fallbackFactory=DeptServerFallBack.class)
public interface DeptFeignService {

    @RequestMapping("/dept/getDeptList")
    public List<Dept> getList();
}

4、服务熔断
这个地方是当使用Feign访问其他服务,出现服务出错,长时间未响应的情况就会采用以下的情况进行响应,也叫熔断。就像是商店临时有事挂个暂时打烊的牌子一个道理,不让用户长时间等待,造成更大的损失。在开发中这种方式被用来解决服务雪崩。


/**
 *
 * 服务的熔断
 *
 * Hystrix 是基于客户端,所有一般配置在客户端和网关上,当然也可以配置在服务端,用来做限流
 *
 */
@Component
public class DeptServerFallBack implements FallbackFactory<DeptFeignService> {
    @Override
    public DeptFeignService create(Throwable throwable) {
        return new DeptFeignService() {
            @Override
            public List<Dept> getList() {

                ArrayList<Dept> list=new ArrayList<>();

                Dept dept=new Dept();
                dept.setDeptName("这是一个服务降级的接口");

                list.add(dept);
                return list;
            }
        };
    }
}

5、Controller使用Feign访问其他模块的业务

@RestController
@RequestMapping
public class DeptController {

    @Autowired
    DeptFeignService deptFeignService;

    @RequestMapping("/getList")
    public List<Dept> getList(){

        return deptFeignService.getList();
    }

}

注意:
Feign其实就是Ribbon和RestTemplate的结合版本。
Ribbon用于在做了集群的情况下做负载均衡。
RestTemplate用于做RPC远程方法调用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值