Spring Cloud入门笔记(三) 声明式服务调用Feign的使用

本文在如下笔记的基础上进行:

在上一次的笔记中使用了RestTemplate来进行服务间的调用,发现这样写很麻烦,每次都自己通过DiscoveryClient来获取Url、配置数据类型,还要组装参数,如果接口多则代码高度重复,接下来将使用openFeign来实现。

直接在笔记(二)的项目上进行更改,项目结构如下:

 在consumer项目中pom.xml文件中添加一个openFeign依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

配置文件不变但需要在consumer的启动类上加上@EnableFeignClients注解来开启Feign支持,并去掉上次的RestTemplat的bean

@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication {

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

接下来声明一个接口,用来绑定provider提供的服务,如下:

@FeignClient("provider")
public interface RequestService {
    @RequestMapping("/sayHello")
    String sayHello(@RequestParam("name") String name);
}

使用到的@FeignClient("provider")注解是为了将当前的接口与provider服务绑定,其中privider是服务名.在/sayHello中参数前面加上的@RequestParam("name")注解是必须加上去的。然后我们在Controoler中注入RequestService接口来使用,从而RequestService接口会去掉取相关的服务,修改Controller如下:

@RestController
public class TestController {

    @Autowired
    RequestService requestService;

    @RequestMapping("/sayHello")
    public String sayHello(String name){
        return requestService.sayHello(name);
    }
}

相对于笔记(二)使用RestTemplate方式来请求是不是方便了许多?

接下来启动项目来访问一下/sayHello接口,返回如下:

看得出是和笔记(二)的结果是一样的,但是方便了许多。

参数传递

接下来记录一下参数的传递的基本使用,在开发中我们传递的参数无非计是key/value形式的参数,有的放在请求体(body)中,有的放在请求头(header)中,有的放在url中,接下来主要记录如上四中形式的参数的传递。

首先在cloud工程下新建议个名为entity的子工程,然后在entity工程中新建一个User.java实体类

public class User {
    private String uid;
    private String name;
    private Integer age;

    public User() {
    }
    public User(String uid, String name, Integer age) {
        this.uid = uid;
        this.name = name;
        this.age = age;
    }
    //这里省略了get/set和toStirng方法自己加上
}

注意: 如果你添加了有参数的构造一定要添加无参构造,不然会报错

然后在provider和consumer项目中的pom.xml去引入entity这个项目的依赖

        <dependency>
            <groupId>com.example.test</groupId>
            <artifactId>entity</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

接下来在privider中的Controller中舔加入下接口:为了简单点这些接口都没有和数据库进行交互,只是返回点数据便于测试。

import com.example.test.cloud.entity.User;
@RestController
class TestController {

    @PostMapping("/user")
    public User addUser(@RequestBody User user){
        return user;
    }
    @GetMapping("/user")
    public User getUser(@RequestParam String name){
        return new User("123456",name,24);
    }
    @DeleteMapping("/user/{uid}")
    public String deleteByUser(@PathVariable String uid){
        return uid+"已经删除";
    }
    @PutMapping("/user")
    public String updateUserByUid(@RequestHeader String uid){
        return uid+"更新成功";
    }
}

然后在sonsumer项目中的RequestService接口中舔加如下接口:

@FeignClient("provider")
public interface RequestService {

    @PostMapping("/user")
    public User addUser(@RequestBody User user);
    @GetMapping("/user")
    public User getUser(@RequestParam String name);
    @DeleteMapping("/user/{uid}")
    public String deleteByUser(@PathVariable String uid);
    @PutMapping("/user")
    public String updateUserByUid(@RequestHeader String uid);
}

 接下来我们在consumer的Controller类中注入RequestService接口然后调用接口即可,代码如下:

@RestController
public class TestController {
    @Autowired
    RequestService requestService;
    @RequestMapping("/test")
    public void test(){
        User user = new User("123456","张某某",24);
        System.out.println(requestService.addUser(user));
        System.out.println(requestService.getUser("xiabai"));
        System.out.println(requestService.deleteByUser("1234567"));
        System.out.println(requestService.updateUserByUid("1234678"));
    }
}

然后在浏览器中访问/test接口。然后查看日志输出结果如下

发布了22 篇原创文章 · 获赞 140 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/zzqaaasss/article/details/104319360