声明式服务调用Feign的基础入门

目录

一,Feign的介绍

1,什么是Feign?

2,Feign工作原理

1,将Feign接口代理类注入到Spring容器中:

2,为接口的方法创建RequestTemplate

3,发出请求

二,Feign的入门

1,创建服务提供者:Feign_provider

pom文件

yml文件

启动类

controller类

service类

2,创建feign接口

pom文件

feign

3,创建服务消费者:Feign_consumer

pom文件

yml文件

启动类

controller类

测试 :

​编辑

 三,Feign的参数传递

1、?传参  :@RequestParam("id")

2、restful传参 : @PathVariable("id")

3、pojo传参 :@RequestBody


一,Feign的介绍

1,什么是Feign?

Feign是Spring Cloud提供的声明式、模板化的HTTP客户端,工作在consumer端。

Feign支持了Spring MVC注解

Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡的效果

2,Feign工作原理

1,将Feign接口代理类注入到Spring容器中:

@EnableFeignClients注解开启Feign扫描,先调用FeignClientsRegistrar.registerFeignClients()方法扫描@FeignClient注解的接口,再将这些接口注入到Spring IOC容器中,方便后续被调用。

2,为接口的方法创建RequestTemplate

当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数,httpMethod)

3,发出请求

发请求时会通过RequestTemplate创建Request对象,然后client(HttpClient、OkHttp、UrlConnect)使用Request对象发送请求

二,Feign的入门

1,创建服务提供者:Feign_provider

pom文件

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
<!--        Nacos服务中心的启动器-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>Feign_interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

yml文件

server:
  port: 8090
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.122.131:8848 #nacos服务的地址
  application:
    name: Feign-provider #注册到nacos的服务名

启动类

@SpringBootApplication
@EnableDiscoveryClient //把当前服务注册到nacos,并发现其它服务
public class FeignProviderApp {

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

controller类

@RestController
@RequestMapping("/provider")
public class ProviderController {

    @Autowired
    private UserService userService;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }
}

service类

//实现类
@Service
public class UserServiceImpl implements UserService {
    @Override
    public User getUserById(Integer id) {
        return new User(id,"@遗失的风",18);
    }
}


//接口
public interface UserService {

    User getUserById(Integer id);
}

2,创建feign接口

pom文件

    <dependencies>
        <!--Spring Cloud OpenFeign Starter -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

feign

@FeignClient("Feign-provider")//调用的服务名
@RequestMapping("/provider")
public interface UserFeign {

    @RequestMapping("/getUserById/{id}")//请求的url
    public User getUserById(@PathVariable("id") Integer id);
}

3,创建服务消费者:Feign_consumer

pom文件

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>Feign_interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
    </dependencies>

yml文件

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.122.131:8848 #nacos服务的地址
  application:
    name: Feign-consumer #注册到nacos的服务名

启动类

@SpringBootApplication
@EnableDiscoveryClient //开启nacos,允许注册当前服务,并发现其它服务
@EnableFeignClients //开启feign注解的扫描
public class FeignConsumerApp {

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

controller类

@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    @Autowired
    public UserFeign userFeign;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
       System.out.println(userFeign.getClass());
       return userFeign.getUserById(id);
    }
}

测试 :

 三,Feign的参数传递

1、?传参  :@RequestParam("id")

Feign_consumer:

    @RequestMapping("/editUserById")//?传参
    public User editUserById(Integer id){
        return userFeign.editUserById(id);
    }

 feign接口:

    @RequestMapping("/editUserById")//?传参
    User editUserById(@RequestParam("id") Integer id);

Feign_provider:

    @Override
    public User editUserById(Integer id) {
        return new User(id,"@遗失的风修改007",18);
    }


2、restful传参 : @PathVariable("id")

 Feign_consumer:

    @RequestMapping("/getUserById/{id}")//restful传参
    public User getUserById(@PathVariable Integer id){
        return userFeign.getUserById(id);
    }

 feign接口:

    @RequestMapping("/getUserById/{id}")//请求的url  restful传参
    public User getUserById(@PathVariable("id") Integer id);

Feign_provider:

    @Override
    public User getUserById(Integer id) {
        return new User(id,"@遗失的风",18);
    }

3、pojo传参 :@RequestBody

  Feign_consumer:

    @RequestMapping("/addUser")//pojo对象传参
    public User addUser(User user){
        return userFeign.addUser(user);
    }

 feign接口:

    @RequestMapping("/addUser")
    User addUser(@RequestBody User user);

Feign_provider:

    @Override
    public User addUser(User user) {
        user.setName(user.getName() + "@遗失的风添加了123");
        return user;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值