SpringCloud 微服务 (七) 服务通讯 Feign

继续第(六)篇RestTemplate篇java

作到如今,本机上已经有注册中心: eureka, 服务:client、order、productweb

继续在order中实现通讯向product服务,使用Feign方式spring

下面记录学习和遇到的问题windows

 

order服务中, 开始须要在maven引入Feign的依赖,安全

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-feign</artifactId>
   <version>1.4.4.RELEASE</version>
</dependency>

注意 : 此处是遇到了这个问题 , 必须加上版本version , 否则jar引入不全 , 致使使用不了相关API,好比@EnableFeignClients注解不存在的问题,若是想尝试一下了解依赖问题的话,(这边是windows系统)能够CMD进入项目文件路径,好比本机项目的目录是E:/MyCloud/order , 而后执行mvn clean install -U命令,他会告诉你依赖问题,好比缺乏版本号等等,app

要是不知道某些依赖的全称或版本, 推荐上maven仓库查找,附上URL: http://mvnrepository.com/maven

还有feign改过名字,改为了openfeign,能够用如下代替依赖ide

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

 

下面先在启动类上加上一个fegin的注解@EnableFeignClients ,以下微服务

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
   public static void main(String[] args) {
      SpringApplication.run(OrderApplication.class, args);
   }
}

 

接着请求目标服务product,至关于order是client,因此建一个ProductClient接口来完成任务学习

product服务

请求的接口仍是上篇product中的简单接口,贴出来

@RestController
public class ProductsController {

    @GetMapping("/products")
    public String products(){
        return "hello,this is products";
    }
}

 

order服务中

接口ProductClient

@FeignClient("product")
public interface ProductClient {

    @GetMapping("/products")
    String getProduct();
}

以上@FeignClient(value="product"),product是注册中心product服务的Application名字,意思是这个client是访问product服务用的

Controller 使用该接口方式,比较方便,IDEA的@Autowired会爆红,不须要管他,没问题

@RestController
public class OrderController {

    @Autowired
    private ProductClient client;

    @GetMapping("/get")
    public String getProducts() {
        String str = client.getProduct();

        return str;
    }
}

以上就简单的实现了Feign通讯

 

Feign: 声明式rest客户端 ,以上的操做没有动product服务中的代码,只在order服务中操做, 以接口加注解的方式实现

 

再贴一个例子 在order服务中依据product的id集合获取product列表: ↓↓↓

product服务

Controller层代码: 

@RestController
@RequestMapping("/product")
public class ProductController {

	@Autowired
    private ProductService productService;

	@PostMapping("/orderList")
	public List<Product> orderList(@RequestBody List<String> productIdList){
	    return productService.findByProductIdIn(productIdList);
	}
}

Service 接口:

public interface ProductService {
    List<Product> findByProductIdIn(List<String> productIdList);
}

Service 接口 实现:

@Service
public class ProductServiceImpl implements ProductService {
	@Autowired
    private ProductRepository repository;

    @Override
    public List<Product> findByProductIdIn(List<String> productIdList) {
        return repository.findByProductIdIn(productIdList);
    }
}

repository 接口 (JPA): 

public interface ProductRepository extends JpaRepository<Product,String> {
    List<Product> findByProductIdIn(List<String> productIdList);
}

product 对象:

@Entity
@Data
public class Product {
    @Id
    private String productId;
    private String productName;
    private BigDecimal productPrice;
    private String productPicture;
}

 

@FeignClient 接口块

@FeignClient("product")
public interface ProductClient {
    @PostMapping("/product/orderList")
    List<Product> getOrderList(@RequestBody List<String> productIdList);
}

order服务

Controller测试 :

@RestController
public class OrderController {

    @Autowired
    private ProductClient client;

    @GetMapping("/get")
    public String getProductList() {
    	List<String> productIdList=Arrays.asList("1","2");
        List<Product> productList = productClient.getOrderList(productIdList);

        return "123";
    }
}

两服务传递list类型参数的时候,须要Post请求,且@RequestBody注解转化

两边都设置了product对象,传与接

操做是比较简单的,只是一个普通的访问,可是呢,仍是存在一些low的操做

如今此处有order,product两个服务,好比一个下订单的操做的时候,返回类型和传参是个什么方式呢,天然的微服务下不是你一我的开发的,此处两个服务是举例,假设两个接口不是一个组的开发,也多是对外部使用的接口,咱们本身封装了一个返回类型和传参,那么别人也要跟着建立一个类型DTO什么的,比较不合适,并且容易传递无用,不安全的信息给别人,还有像以前每一个服务都引入maven依赖,好比lombok,web什么的重复了

 

分享学习项目多模块,能够减小maven多余的依赖,也能够分层实现服务,仍是比较容易入手的

-----------------------------------------------------------

相关文章
相关标签/搜索