初识feign,第一个feign项目

1 篇文章 0 订阅
1 篇文章 0 订阅

初识feign,第一个feign项目

​ 相比于@LoadBalance+RestTemplate的方式,使用feign无需将路径全部写出来,从而更加简洁。

​ 并且feign的使用现在的最为广泛的。下面是我的第一个使用feign的项目,第一次使用,感觉很方便,也容易理解,感觉很好用

1、在调用方导入feign相关依赖

<!--导入openfeign依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、提供方(product)的相关controller

`1、在这里的类上面没加@RequestMapping("/product"),目的是方便后面调用方的接口的方法可以直接从这里复制
`2、这里的带普通参数参数的都加@RequestParam(可以不加),目的也是后面调用方的接口的方法可以直接从这里复制
package org.study.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.study.springcloud.entity.Product;

import java.util.HashMap;
import java.util.Map;

@RestController
@Slf4j
public class ProductController {

    @Value("${server.port}")
    private String port;

    @GetMapping("product/showMsg")
    public String showMsg() {
        log.info("进入商品服务,查看商品~~~");
        return "进入商品服务,查看商品~~~,当前服务的端口号:" + port;
    }

    @GetMapping("/product/findAll")
    public Map<String, Object> findAll() {
        log.info("商品服务查询所有,当前接口为:[{}]" + port);
        Map<String, Object> map = new HashMap<>();
        map.put("status", true);
        map.put("msg", "查询所有服务调用成功,服务提供的端口为:" + port);
        return map;
    }

    //传参时,如果是参数是普通参数,则加@RequestParam,如果参数是对象则加@RequestBody
    @GetMapping("/product/one")
    public Map<String, Object> findAOne(@RequestParam("productId") String productId) {
        log.info("商品服务查询所有,当前商品id为:" + productId);
        Map<String, Object> map = new HashMap<>();
        map.put("status", true);
        map.put("msg", "查询所有服务调用成功,服务提供的端口为:" + port);
        map.put("productId", productId);
        return map;
    }

    @PostMapping("/product/save")
    public Map<String, Object> save(@RequestParam("name") String name) {
        log.info("商品服务查询所有,当前商品name为:" + name);
        Map<String, Object> map = new HashMap<>();
        map.put("status", true);
        map.put("msg", "查询所有服务调用成功,服务提供的端口为:" + port);
        map.put("name", name);
        return map;
    }

    @PostMapping("/product/update")
    public Map<String, Object> update(@RequestBody Product product) {
        log.info("商品服务查询所有,当前商品product为:" + product);
        Map<String, Object> map = new HashMap<>();
        map.put("status", true);
        map.put("msg", "查询所有服务调用成功,服务提供的端口为:" + port);
        map.put("product", product);
        return map;
    }
}

3、调用方自定义的Client接口

1、在接口上加入@FeignClient(value = "提供者的服务id")

2、将调用的服务的controller的请求方法复制过来

package org.study.springcloud.clients;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.study.springcloud.entity.Product;

import java.util.Map;
//调用商品服务的openfeign组件,openfeign集成了ribbon,默认使用轮询策略
//使用时注入调用
@FeignClient(value = "Product")    //作用:用来标识当前接口是一个feign 的组件  value:书写调用服务的服务id
public interface ProductClient {

    @GetMapping("product/showMsg")
    String showMsg();

    @GetMapping("/product/findAll")
    Map<String, Object> findAll();

    //使用openfeign的GET方式传参数,参数变量必须通过@RequestParam注解进行修饰且value需与product的controller的方法的参数名一致,不加注解会报错
    @GetMapping("/product/one")
    Map<String, Object> findOne( @RequestParam("productId") String aa );

    //测试post请求传参
    @PostMapping("/product/save")
    Map<String, Object> save(@RequestParam("name")String name);

    //使用post方式传递参数为对象时,提供方和调用者必须加入@requestBody注解
    @PostMapping("/product/update") 
    Map<String, Object> update(@RequestBody Product product);
}

# 方法的特别点

`返回值为String的get请求`
@GetMapping("product/showMsg")
public String showMsg() 	

`返回值为一个Map集合的get请求,页面展示为json格式的数据`
@GetMapping("/product/findAll")
public Map<String, Object> findAll() 

`带普通参数的get请求传参,必须加入@RequestParam`
@GetMapping("/product/findAll")
public Map<String, Object> findAOne(@RequestParam("productId") String productId)

`带普通参数的post请求传参`
@PostMapping("/product/save")
public Map<String, Object> save(@RequestParam("name") String name)

`//使用post方式传递参数为对象时,提供方和调用者必须加入@requestBody注解`
@PostMapping("/product/update") 
Map<String, Object> update(@RequestBody Product product);

4、调用方的测试的controller类

package org.study.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.study.springcloud.clients.ProductClient;
import org.study.springcloud.entity.Product;

import java.util.Map;

@RestController
@Slf4j
public class TestFeignController {

    @Autowired
    private ProductClient productClient;

    @GetMapping("/feign/test")
    public String test(){
        log.info("进入测试fegin调用的方法");
        String msg = productClient.showMsg();
        log.info("调用商品服务返回的信息[{}]",msg);
        return msg;
    }

    @GetMapping("/feign/test2")
    public Map<String,Object> test2(){
        log.info("进入测试fegin调用的方法2");
        Map<String, Object> map = productClient.findAll();
        log.info("调用商品服务2返回的信息[{}]",map);
        return map;
    }

    //测试get请求传参
    @GetMapping("/feign/test3")
    public Map<String,Object> test3(String id){
        log.info("进入测试fegin调用的方法3,id为[{}]",id);
        Map<String, Object> map = productClient.findOne(id);
        log.info("调用商品服务2返回的信息[{}]",map);
        return map;
    }

    //测试post请求传参,
    @GetMapping("/feign/test4")
    public Map<String,Object> test4(String name){
        log.info("进入测试feign调用的方法4,name为[{}]",name);
        Map<String, Object> map = productClient.findOne(name);
        log.info("调用商品服务2返回的信息[{}]",map);
        return map;
    }

    //测试post请求传参(对象),
    @GetMapping("/feign/test5")
    public Map<String,Object> test5(Product product){
        log.info("进入测试feign调用的方法5,product为[{}]",product);
        Map<String, Object> map = productClient.update(product);
        log.info("调用商品服务2返回的信息[{}]",map);
        return map;
    }
}

注:这里的请求方式都是GetMapping

5、调用方的启动类加入@EnableFeignClients

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目中使用 Feign 调用其他服务的步骤如下: 1. 添加依赖:在你的项目的 pom.xml(如果使用 Maven)或 build.gradle(如果使用 Gradle)文件中,添加 Feign 相关的依赖。 2. 创建 Feign 接口:定义一个接口,用于声明需要调用的远程服务的方法。可以使用 Spring MVC 的注解来标识请求路径、请求方法、请求参数等信息。 3. 启用 Feign:在启动类上添加 `@EnableFeignClients` 注解,以启用 Feign 客户端。 4. 使用 Feign 接口:在需要调用其他服务的地方,通过依赖注入的方式获取 Feign 接口的实例,然后直接调用接口中定义的方法即可。 以下是一个简单的示例: 首先,添加 Feign 相关的依赖。例如,如果使用 Maven,可以添加以下依赖到 pom.xml 文件中: ```xml <dependencies> <!-- 其他依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> ``` 接着,创建一个 Feign 接口。例如,定义一个名为 `UserServiceFeignClient` 的接口,用于调用用户服务: ```java @FeignClient(name = "user-service") // 指定要调用的服务名称 public interface UserServiceFeignClient { @GetMapping("/users/{id}") User getUserById(@PathVariable("id") Long id); } ``` 然后,在启动类上添加 `@EnableFeignClients` 注解,以启用 Feign 客户端: ```java @EnableFeignClients @SpringBootApplication public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 最后,在需要调用其他服务的地方,通过依赖注入的方式获取 Feign 接口的实例,然后调用接口中定义的方法即可: ```java @RestController public class YourController { @Autowired private UserServiceFeignClient userServiceFeignClient; @GetMapping("/users/{id}") public User getUserById(@PathVariable("id") Long id) { return userServiceFeignClient.getUserById(id); } } ``` 以上就是使用 Feign项目中调用其他服务的基本步骤。当然,还可以根据具体需求配置 Feign 的超时时间、错误处理、负载均衡等参数。 希望以上信息对你有所帮助!如有更多疑问,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值