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多餘的依賴,也能夠分層實現服務,仍是比較容易入手的

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