本文在如下笔记的基础上进行:
在上一次的笔记中使用了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接口。然后查看日志输出结果如下