简单介绍
这是另一种跨服务调用,类似与RestTemplate
首先先添加依赖(这是老版本)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
这是现代版本依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后启动类加注解
package com.sola;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication
@EnableSwagger2
@EnableEurekaClient
@EnableFeignClients
public class EurekaClientPostManApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientPostManApplication.class, args);
}
}
下面开始表演时间,加入一接口,并添加feign注解
@feignClient注解上添加要取调用的服务注册名,@GetMapping注解上添加要调用方法路径
package com.sola.feignclient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "EurekaClient-PostMan")
public interface PostManClient {
@GetMapping("/eurekaApi/test")
public String getMsg();
}
之后就可以在Service层中自动注入并调用啦
package com.sola.service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.sola.dao.RoadWorkDao;
import com.sola.feignclient.PostManClient;
@Service
public class RoadWorkService {
@Autowired
private RoadWorkDao resourcesdao;
//注入feign配置的接口,重点1
@Autowired
private PostManClient postmanclient;
public Map<String, Object> findroadwork() {
// TODO Auto-generated method stub
List<Map<String, Object>> list = null ;
Map<String,Object> map = new HashMap<>();
list = resourcesdao.findroadwork();
//重点在这2
String msg = postmanclient.getMsg();
map.put("postman", msg);
map.put("data", list);
return map;
}
}
下面测试下传值查询
Postman添加了一个根据名查查询的方法
@PostMapping(value="findPolicebyname")
@ApiOperation("根据姓名查询警员")//警员请假 新增时候 查询警员
public List<Map<String, Object>> findPoliceByName(@RequestBody String name){
return resourcesservice.findPoliceByName(name);
}
调用端添加对应的接口
@PostMapping("/eurekaApi/findPolicebyname")
public List<Map<String, Object>> findPoliceByName(@RequestBody String name);
然后去调用
public Map<String, Object> findroadwork() {
// TODO Auto-generated method stub
List<Map<String, Object>> list = null ;
Map<String,Object> map = new HashMap<>();
list = resourcesdao.findroadwork();
String msg = postmanclient.getMsg();
List<Map<String, Object>> findPolice = postmanclient.findPolice();
List<Map<String, Object>> findPoliceByName = postmanclient.findPoliceByName("司");
map.put("调用PostMan全警员查询", findPolice);
map.put("调用PostMan根据名字查询警员", findPoliceByName);
map.put("postman", msg);
map.put("data", list);
return map;
}
这就可以了
#不过经过测试 貌似只有Post请求可以并且需要添加@RequestBody注解。
(我错了因为@RequestBody要加post注解,后面课程说到要用GetMapping必须要加@RequestParam注解或@PathVariable注解)
还突发奇想的如果注册的同一个服务ID,一个有根据名称查询人员,一个没有会如何呢=。=
因为Ribbon默认配置的就是轮询 ,所以结果就是一次正常返回,一次报错。
高级一点的传参数,PostMan
@PostMapping(value="findPoliceinanyname")
@ApiOperation("根据多个准确姓名查询警员")//警员请假 新增时候 查询警员
public List<Map<String, Object>> findPoliceInAnyName(@RequestBody List<String> names){
return resourcesservice.findPoliceInAnyName(names);
}
<select id="findPoliceInAnyName" resultType="java.util.Map">
SELECT *
FROM ZNJTPOSTMAN.VRESOURCE_POLICE T
WHERE T.JYXM
IN
<foreach collection="names" item="name" open="(" close=")" separator=",">
#{name}
</foreach>
</select>
调用postman的roadwork,先添加接口
@PostMapping(value="/eurekaApi/findPoliceinanyname")
public List<Map<String, Object>> findPoliceInAnyName(@RequestBody List<String> names);
之后调用
@Service
public class RoadWorkService {
@Autowired
private RoadWorkDao resourcesdao;
//注入feign配置的接口
@Autowired
private PostManClient postmanclient;
public Map<String, Object> findroadwork() {
// TODO Auto-generated method stub
List<Map<String, Object>> list = null ;
Map<String,Object> map = new HashMap<>();
list = resourcesdao.findroadwork();
String msg = postmanclient.getMsg();
List<Map<String, Object>> findPolice = postmanclient.findPolice();
List<Map<String, Object>> findPoliceByName = postmanclient.findPoliceByName("司");
List<Map<String, Object>> findPoliceInAnyName = postmanclient.findPoliceInAnyName(Arrays.asList("李晶","安晶"));
map.put("调用PostMan全警员查询", findPolice);
map.put("调用PostMan根据名字查询警员", findPoliceByName);
map.put("调用PostMan根据多个详细名字查询警员", findPoliceInAnyName);
map.put("postman", msg);
map.put("data", list);
return map;