天天看點

OpenFeign用戶端OpenFeign用戶端

OpenFeign用戶端

  • OpenFeign用戶端
    • 建構微服務項目
      • 父工程依賴pom.xml
      • provider-service-api
      • provider-service-impl
        • application.yml
        • ProviderServiceImpl
        • 主啟動類
      • consumer-service-impl
        • ConsumerServiceFeign
        • ConsumerService
        • 主啟動類

OpenFeign用戶端

OpenFeign是一個Web聲明式的Http用戶端調用工具,提供接口和注解形式調用。

建構微服務項目

以下子產品都是空Maven項目

openfeign-parent—父工程(隻需要添加依賴即可)

  • service-api----微服務Api接口層(空項目)
    • provider-service-api
  • service-impl----微服務Api實作層(空項目)
    • provider-service-impl
    • consumer-service-impl

父工程依賴pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
</dependencies>
           

provider-service-api

public interface ProviderService {
    /**
     * 提供我們釋出的接口
     * 這裡可以試一下不加注解 @RequestParam,必定報錯
     * @param userId
     * @return
     */
    @GetMapping("/getUser")
    String getUser(@RequestParam("userId") Integer userId);
}
           

provider-service-impl

application.yml

server:
  port: 8080
spring:
  application:
    name: provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
           

ProviderServiceImpl

@RestController
@CrossOrigin  //解決跨域問題,我後面的文章會寫到由網關統一解決跨域問題
public class ProviderServiceImpl implements ProviderService {

    @Value("${server.port}")
    private String serverPort;

    /**
     * 這裡不需要加注解 @GetMapping("/getUser")
     * 因為父類已經繼承過來了
     *
     * @param userId
     * @return
     */
    @Override
    public String getUser(Integer userId) {
        return "我是提供者服務:" + serverPort;
    }

}
           

主啟動類

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

啟動provider-service-impl項目測試即可 http://localhost:8080/getUser?userId=1

OpenFeign用戶端OpenFeign用戶端

現在開始進入正題

consumer-service-impl

openfeign使用起來也非常簡單,與feign一樣,是面向接口,是以我們寫一個接口

ConsumerServiceFeign

@FeignClient("provider") //自動從注冊中心擷取服務名
public interface ConsumerServiceFeign {
	//這裡的方法和provider裡面的方法是一樣的
    //方法名可以不一樣,但是參數必須保持一緻
    @GetMapping("/getUser")
    String getUser(@RequestParam("userId") Integer userId);
}
           

ConsumerService

@RestController
public class ConsumerService {
    @Autowired
    private ConsumerServiceFeign providerServiceFeign;

    /**
     * 基于我們Feign用戶端形式實作  RPC 遠端調用
     *
     * @return
     */
    @RequestMapping("/consumerFeignToProvider")
    public String consumerFeignToProvider() {
        String result = providerServiceFeign.getUser(1);
        return "我是消費者調用提供者的接口:傳回結果:" + result;
    }

}
           

主啟動類

@SpringBootApplication
@EnableFeignClients  //加上注解
public class AppConsumer {
    public static void main(String[] args) {
        SpringApplication.run(AppConsumer.class, args);
    }
}
           

啟動項目通路 http://localhost:8090/consumerFeignToProvider 即可

OpenFeign用戶端OpenFeign用戶端

OpenFeign也支援叢集,隻需要再啟動一個 provider-service-impl 項目即可,改變端口,預設的負載均衡也是為輪詢算法

繼續閱讀