1. 程式人生 > >(二)服務提供與呼叫

(二)服務提供與呼叫

案例中有三個角色:服務註冊中心、服務提供者、服務消費者,其中服務註冊中心就是我們上一篇的eureka單機版啟動既可,流程是首先啟動註冊中心,服務提供者生產服務並註冊到服務中心中,消費者從服務中心中獲取服務並執行。

服務提供
我們假設服務提供者有一個hello方法,可以根據傳入的引數,提供輸出“hello ,this is first messge”的服務

新建專案

依次選擇

如果上面的沒有選擇就pom新增

        <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>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

 application.properties配置

spring.application.name=producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

ProducerApplication啟動類主要是@EnableDiscoveryClient

package com.producer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ProducerApplication {

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

controller

提供hello服務

@RestController
public class HelloController {
	
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        return "hello "+name+",this is first messge";
    }
}

 專案目錄

新增@EnableDiscoveryClient註解後,專案就具有了服務註冊的功能。啟動工程後,就可以在註冊中心的頁面看到SPRING-CLOUD-PRODUCER服務。

 

到此服務提供者配置就完成了。

 

服務呼叫

依次新增

如果上面的沒有操作請新增pom

 <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>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

 application.properties配置

spring.application.name=consumer
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

啟動類

啟動類新增@EnableDiscoveryClient@EnableFeignClients註解。

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

 

@EnableDiscoveryClient :啟用服務註冊與發現
@EnableFeignClients:啟用feign進行遠端呼叫
Feign是一個宣告式Web Service客戶端。使用Feign能讓編寫Web Service客戶端更加簡單, 它的使用方法是定義一個介面,然後在上面添加註解,同時也支援JAX-RS標準的註解。Feign也支援可拔插式的編碼器。Spring Cloud對Feign進行了封裝,使其支援了Spring MVC標準註解和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支援負載均衡。

4、feign呼叫實現

@FeignClient(name= "producer")
public interface HelloRemote {
    @RequestMapping(value = "/hello")
    public String hello(@RequestParam(value = "name") String name);
}
  • name:遠端服務名,及spring.application.name配置的名稱

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

web層呼叫遠端服務

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

@RestController
public class ConsumerController {
 
    @Autowired
    HelloRemote HelloRemote;
	
    @RequestMapping("/hello/{name}")
    public String index(@PathVariable("name") String name) {
        return HelloRemote.hello(name);
    }
 
}

到此,最簡單的一個服務註冊與呼叫的例子就完成了。

測試
簡單呼叫
依次啟動eureka、producer、consumer三個專案

先輸入:http://localhost:9000/hello?name=neo 檢查producer服務是否正常

返回:hello neo,this is first messge

說明producer正常啟動,提供的服務也正常。

瀏覽器中輸入:http://localhost:9001/hello/neo

返回:hello neo,this is first messge

說明客戶端已經成功的通過feign呼叫了遠端服務hello,並且將結果返回到了瀏覽器。

負載均衡
以上面producer為例子修改,將其中的controller改動如下:

@RestController
public class HelloController {
	
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        return "hello "+name+",this is producer 2  send first messge";
    }
}

在配置檔案中改動埠:

spring.application.name=producer
server.port=9003
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

打包啟動後,在eureka就會發現兩個服務提供者,如下圖:

 

然後在瀏覽器再次輸入:http://localhost:9001/hello/neo 進行測試:

第一次返回結果:hello neo,this is first messge

第二次返回結果:hello neo,this is producer 2 send first messge

不斷的進行測試下去會發現兩種結果交替出現,說明兩個服務中心自動提供了服務均衡負載的功能。如果我們將服務提供者的數量在提高為N個,測試結果一樣,請求會自動輪詢到每個服務端來處理。