Spring Cloud 学习笔记-05-Feign

什么是Feign?
1.Feign是基于Ribbon实现的,是一个声明式、模板化的Web Service客户端,实现负载均衡。
2.相比较于Ribbon+RestTemplate的方式,Feign大大简化了代码的开发,开发者可以通过简单的接口和注解来调用HTTP API。支持Feign注解、JAX-RS注解、Spring MVC注解。
3.Feign集成了Hystrix,具备服务熔断的功能。具有可插拔、基于注解、负载均衡、服务
熔断的一系列便捷功能。

代码实现

1.创建Module 名字叫feign , pom.xml添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
</dependencies>

2.resources文件夹下创建配置文件application.yml

server:
  port: 8050
spring:
  application:
    name: feign
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

3.创建启动类 com.example.FeignApplication

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients

public class FeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class,args);
    }
}

5创建entity实体类Student

package com.example.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private long id;
    private String name;
    private int age;
}

6.创建声明式接口com.example.feign.FeignProviderClient

import com.example.entity.Student;
import com.example.feign.impl.FeignError;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Collection;

@FeignClient(value = "provider")
public interface FeignProviderClient {
    @GetMapping("/student/findAll")
    public Collection<Student> findAll();
    @GetMapping("/student/port")
    public String port();
}

7.创建类com.example.controller.FeignHandler实现接口方法

package com.example.controller;

import com.example.entity.Student;
import com.example.feign.FeignProviderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collection;

@RestController
@RequestMapping("/feign")
public class FeignHandler {

    @Autowired
    private FeignProviderClient feignProviderClient;

    @GetMapping("/findAll")
    public Collection<Student> findAll(){
        return feignProviderClient.findAll();
    }

    @GetMapping("/port")
    public String port(){
        return feignProviderClient.port();
    }
}

8.启动eurekaserver模块,启动eurekaclient模块,在eurekaclient添加第二个启类ProviderApplication2

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProviderApplication2 {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication2.class,args);
    }
}

修改eurekaclient的application.yml 的server.port: 8011,启动eurekaclient的第二个启动类,

启动Feign模块。启动后如下

9.浏览器中输入http://localhost:8050/feign/port 验证负载均衡,刷新页面会交替访问两个provider的getPort

 10.服务熔断,feign模块的application.yml添加熔断机制

feign:
  hystrix:
    enabled: true

属性说明:feign.hystrix.enabled:是否开启熔断器。

11.创建FeignProviderClient接口的实现类FeignError

package com.example.feign.impl;

import com.example.entity.Student;
import com.example.feign.FeignProviderClient;
import org.springframework.stereotype.Component;

import java.util.Collection;

@Component
public class FeignError implements FeignProviderClient {
    @Override
    public Collection<Student> findAll() {
        return null;
    }

    @Override
    public String port() {
        return "服务器维护中...";
    }
}

12.在接口FeignProviderClient,添加注解属性fallback = FeignError.class

@FeignClient(value = "provider",fallback = FeignError.class)

 13.关闭eurekaclient模块,重启feign模块,访问localhost:8050/feign/port

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值