SpringCloud微服务学习----------Feign的使用

简单介绍

这是另一种跨服务调用,类似与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;

猜你喜欢

转载自blog.csdn.net/jiulanhao/article/details/82626158