java Spring Cloud b2b2c o2o 電子商務 Eureka【Finchley 版】-b2b2c小程式電子商務

gung123發表於2020-03-13

介紹了 Eureka 服務註冊中心的搭建,這篇文章介紹一下如何使用 Eureka 服務註冊中心,搭建一個簡單的服務端註冊服務,客戶端去呼叫服務使用的案例。


瞭解springcloud架構可以加求求:三五三六二四七二五九



案例中有三個角色:服務註冊中心、服務提供者、服務消費者,其中服務註冊中心就是我們上一篇的 Eureka 單節點啟動既可。

流程如下:


啟動註冊中心

服務提供者生產服務並註冊到服務中心中

消費者從服務中心中獲取服務並執行

服務提供者
我們假設服務提供者有一個 hello() 方法,可以根據傳入的引數,提供輸出 “hello xxx + 當前時間” 的服務。

POM 包配置
建立一個基本的 Spring Boot 應用,命名為 eureka-producer,在 pom.xml 中新增如下配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

配置檔案
application.yml 配置如下

spring:
  application:
    name: eureka-producer
eureka:
  client:
    service-url:
      defaultZone: 
server:
  port: 8000

透過 spring.application.name 屬性,我們可以指定微服務的名稱後續在呼叫的時候只需要使用該名稱就可以進行服務的訪問。eureka.client.serviceUrl.defaultZone 屬性對應服務註冊中心的配置內容,指定服務註冊中心的位置。為了在本機上測試區分服務提供方和服務註冊中心,使用 server.port 屬性設定不同的埠。


啟動類

保持預設生成的即可, Finchley.RC1 這個版本的 Spring Cloud 已經無需新增 @EnableDiscoveryClient 註解了。(那麼如果我引入了相關的 jar 包又想禁用服務註冊與發現怎麼辦?設定 eureka.client.enabled=false)


@EnableDiscoveryClient is no longer required. You can put a DiscoveryClient implementation on the classpath to cause the Spring Boot application to register with the service discovery server.

Spring Cloud - @EnableDiscoveryClient

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

啟動工程後,就可以在註冊中心 Eureka 的頁面看到 EUERKA-PRODUCER 服務。



服務消費者

建立服務消費者根據使用 API 的不同,大致分為三種方式。雖然大家在實際使用中用的應該都是 Feign,但是這裡還是把這三種都介紹一下吧,如果你只關心 Feign,可以直接跳到最後。

java Spring Cloud b2b2c o2o 電子商務 Eureka【Finchley 版】-b2b2c小程式電子商務

三種方式均使用同一配置檔案,不再單獨說明了

spring:
  application:
    name: eureka-consumer
eureka:
  client:
    service-url:
      defaultZone:  # 指定 Eureka 註冊中心的地址
server:
  port: 9000 # 分別為 9000、9001、9002

使用 LoadBalancerClient

從 LoadBalancerClient 介面的命名中,我們就知道這是一個負載均衡客戶端的抽象定義,下面我們就看看如何使用 Spring Cloud 提供的負載均衡器客戶端介面來實現服務的消費。


POM 包配置

我們先來建立一個服務消費者工程,命名為:eureka-consumer。pom.xml 同 Producer 的,不再贅述。


啟動類

初始化 RestTemplate,用來發起 REST 請求。

@SpringBootApplication
public class EurekaConsumerApplication {
   @Bean 
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class, args);
    }
}

Controller
建立一個介面用來消費 eureka-producer 提供的介面:

@RequestMapping ("/hello")
@RestController 
public class HelloController {
   @Autowired 
    private LoadBalancerClient client;
    @Autowired
    private RestTemplate restTemplate;
   @GetMapping ("/")
    public String hello(@RequestParam String name) {
        name += "!";
        ServiceInstance instance = client.choose("eureka-producer");
        String url = "() + ":" + instance.getPort() + "/hello/?name=" + name;
        return restTemplate.getForObject(url, String.class);
    }
}

可以看到這裡,我們注入了 LoadBalancerClient 和 RestTemplate,並在 hello 方法中,先透過 loadBalancerClient 的 choose 方法來負載均衡的選出一個 eureka-producer 的服務例項,這個服務例項的基本資訊儲存在 ServiceInstance 中,然後透過這些物件中的資訊拼接出訪問服務呼叫者的 /hello/ 介面的詳細地址,最後再利用 RestTemplate 物件實現對服務提供者介面的呼叫。


另外,為了在呼叫時能從返回結果上與服務提供者有個區分,在這裡我簡單處理了一下,name+="!",即服務呼叫者的 response 中會比服務提供者的多一個感嘆號(!)。


Spring Cloud Ribbon

之前已經介紹過 Ribbon 了,它是一個基於 HTTP 和 TCP 的客戶端負載均衡器。它可以透過在客戶端中配置 ribbonServerList 來設定服務端列表去輪詢訪問以達到均衡負載的作用。


當 Ribbon 與 Eureka 聯合使用時,ribbonServerList 會被 DiscoveryEnabledNIWSServerList 重寫,擴充套件成從 Eureka 註冊中心中獲取服務例項列表。同時它也會用 NIWSDiscoveryPing 來取代 IPing,它將職責委託給 Eureka 來確定服務端是否已經啟動。


POM 包配置

將之前的 eureka-consumer 工程複製一份,並命名為 eureka-consumer-ribbon。


pom.xml 檔案還用之前的就行。至於 spring-cloud-starter-ribbon,因為我使用的 Spring Cloud 版本是 Finchley.RC1,spring-cloud-starter-netflix-eureka-client 裡邊已經包含了 spring-cloud-starter-netflix-ribbon 了。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

啟動類
修改應用主類,為 RestTemplate 新增 @LoadBalanced 註解

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

Controller
修改 controller,去掉 LoadBalancerClient,並修改相應的方法,直接用 RestTemplate 發起請求

@GetMapping("/")
public String hello(@RequestParam String name) {
    name += "!";
    String url = "
    return restTemplate.getForObject(url, String.class);
}

可能你已經注意到了,這裡直接用服務名 eureka-producer 取代了之前的具體的 host:port。那麼這樣的請求為什麼可以呼叫成功呢?因為 Spring Cloud Ribbon 有一個攔截器,它能夠在這裡進行實際呼叫的時候,自動的去選取服務例項,並將這裡的服務名替換成實際要請求的 IP 地址和埠,從而完成服務介面的呼叫。


Spring Cloud Feign

在實際工作中,我們基本上都是使用 Feign 來完成呼叫的。我們透過一個例子來展現 Feign 如何方便的宣告對 eureka-producer 服務的定義和呼叫。歡迎大家加我qq:1038774626探討技術問題。

POM 包配置

建立一個基本的 Spring Boot 應用,命名為 eureka-producer-feign,在 pom.xml 中新增如下配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

啟動類
在啟動類上加上 @EnableFeignClients

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

此類中的方法和遠端服務中 Contoller 中的方法名和引數需保持一致。

這裡有幾個坑,後邊有詳細說明。

Controller
修改 Controller,將 HelloRemote 注入到 controller 層,像普通方法一樣去呼叫即可

@RequestMapping
@Restcontroller ("/hello")
public class HelloController {
    @Autowired
    HelloRemote helloRemote;
  @GetMapping  ("/{name}")
    public String index(@PathVariable("name") String name) {
        return helloRemote.hello(name + "!");
    }
}

透過 Spring Cloud Feign 來實現服務呼叫的方式非常簡單,透過 @FeignClient 定義的介面來統一的宣告我們需要依賴的微服務介面。而在具體使用的時候就跟呼叫本地方法一點的進行呼叫即可。由於 Feign 是基於 Ribbon 實現的,所以它自帶了客戶端負載均衡功能,也可以透過 Ribbon 的 IRule 進行策略擴充套件。另外,Feign 還整合的 Hystrix 來實現服務的容錯保護,這個在後邊會詳細講。(在 Finchley.RC1 版本中,Feign 的 Hystrix 預設是關閉的。參考 Spring Cloud OpenFeign 和 Disable HystrixCommands For FeignClients By Default)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952307/viewspace-2680008/,如需轉載,請註明出處,否則將追究法律責任。

相關文章