微服務--Eureka Provider Consumer通信

步驟


  • 前提基於 Eureka Server 註冊中心搭建完成
  • 開始搭建Provider 和 Consumer 服務
  • 通過Fegin 進行通信

搭建Eureka Provider


創建Eureka Provider工程 ;POM引入依賴 netflix-eureka-client
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- eureka server依賴包 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <!-- 低版本 -->
        <!-- <artifactId>spring-cloud-starter-eureka-server</artifactId> -->
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
application.properties 配置註冊中心
spring.application.name=spring-cloud-eureka-provider
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
啓動類
  • 聲明啓用服務發現客戶端
  • 標註 @EnableDiscoveryClient 註解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class EurekaConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class, args);
    }
}
提供一個HTTP服務
  • 用於測試調用
@RestController
@RequestMapping("/")
public class IndexController {
    @RequestMapping("/hello")
    public String hello(String name) {
        return "hello" + name;
    }
}
啓動
  • 前提需要Eureka Server 註冊中心先行啓動
  • 啓動註冊完成
    在這裏插入圖片描述在這裏插入圖片描述

搭建Eureka Consumer


創建Eureka Consumer工程
  • 引入netflix-eureka-client Eureka客戶端jar包
  • starter-openfeign feign 聲明式調用jar包
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- eureka server依賴包 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
配置服務實例,註冊中心
  • application.properties
spring.application.name=spring-cloud-eureka-consumer
server.port=8080
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
啓動類
  • 開啓Eureka服務發現 ;加上註解:@EnableDiscoveryClient
  • 開始Feign 客戶端聲明式通信 ; 加上註解:@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class EurekaConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class, args);
    }
}
聲明Feign Client 接口;只需要接口方法
  • @FeignClient 註解來生命;name 或 value 指定遠程服務的實例名
  • @RequestMapping 指定訪問http 路徑
  • @RequestParam request請求參數
@FeignClient(name = "spring-cloud-eureka-provider")
public interface IndexRemote {
    @RequestMapping(value = "/hello")
    String hello(@RequestParam(value = "name") String name);
}
服務調用
  • 注入FeignClient生命的遠程調用
  • 調用接口
@RestController
@RequestMapping("/")
public class ConsumerController {
    @Autowired
    private IndexRemote indexRemote;

    @RequestMapping("/index/{name}")
    public String index(@PathVariable("name") String name) {
        return indexRemote.hello(name);
    }
}
啓動、調試調用
  • 啓動註冊完成在這裏插入圖片描述
    在這裏插入圖片描述
  • 調用成功
    在這裏插入圖片描述

Eureka Provider集羣;Feign負載均衡


Eureka Provider集羣
  • 配置集羣 application.yml 文件 ;指定多個profiles
spring:
  application:
    name: spring-cloud-eureka-provider
  profiles: provider1

server:
  port: 9000

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/

---
spring:
  application:
    name: spring-cloud-eureka-provider
  profiles: provider2

server:
  port: 9001

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/

---
spring:
  application:
    name: spring-cloud-eureka-provider
  profiles: provider3

server:
  port: 9002

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/
  • 服務類稍作修改,返回具體節點信息
@RestController
@RequestMapping("/")
public class IndexController {

    @Value("${spring.profiles}")
    private String profile;

    @RequestMapping("/hello")
    public String hello(String name) {
        return "hello" + name + profile;
    }

}
啓動註冊
  • 三臺Provider都啓動成功
  • 查看Eureka Server註冊信息,註冊成功
    在這裏插入圖片描述
客戶端調用調試
  • 分別進行三次請求,默認輪詢到Provider的三臺節點
    在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

Feign


簡單介紹
  • Feign是一個聲明式Web Service客戶端。使用Feign能讓編寫Web Service客戶端更加簡單, 它的使用方法是定義一個接口,然後在上面添加註解,同時也支持JAX-RS標準的註解。
  • Feign也支持可拔插式的編碼器和解碼器。Spring Cloud對Feign進行了封裝,使其支持了Spring MVC標準註解和HttpMessageConverters。
  • Feign可以與Eureka和Ribbon組合使用以支持負載均衡。
Feign Client的簡單流程
  • 首先通過@EnableFeignClients註解開啓FeignClient的功能,才能在程序啓動時開啓對@FeignClient註解的包掃描
  • 根據Feign的規則實現接口,並在接口上加上@FeignClient註解
  • 程序啓動時,進行包掃描,掃描@FeignClient註解的類,注入到IOC容器中
  • 當接口被調用時,通過JDK的代理生成具體的RequestTemplate模板對象
  • 根據RequestTemplate再生成Http請求的Request對象
  • Request對象交由Client去處理,Client的網絡請求框架可以是:HttpURLConnection、HttpClient和OkHttp
  • 最後Client被封裝到LoadBalanceClient類,該類結合Ribbon做到負載均衡
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章