初识feign,第一个feign项目

初识feign,第一个feign项目

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

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

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


<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-openfeignartifactId>
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 findAll() 

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

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

`//使用post方式传递参数为对象时,提供方和调用者必须加入@requestBody注解`
@PostMapping("/product/update") 
Map 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

你可能感兴趣的:(springcloud,ribbon,feign)