啟動Eureka注冊中心之后,服務提供方就可以注冊到Eureka上去(作為一個Eureka的客戶端)
我們使用IDEA提供的spring initializer來新建一個springcloud項目
填寫相關的包名等信息:
選擇web和Erureka Discorvery
填寫Gradle等相關信息完成創建
我們需要在啟動類里邊增加注解 @EnableDiscoveryClient 來標識這是一個Eureka客戶端
啟動類的代碼如下:
package com.jiaoyiping.springcloud.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
創建一個我們用來真正提供服務的Controller(在本例中,我們假設從路徑中取到兩個int值,將他們的和用字符形式返回,代碼如下):
package com.jiaoyiping.springcloud.provider;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductionController {
//簡單計算兩個數字的和,轉換為字符串返回
@RequestMapping(value = "/add/{a}/{b}")
public String add(@PathVariable("a") int a, @PathVariable("b") int b) {
return (a + b) + "";
}
}
修改應用的配置文件,指定服務的名稱,網卡信息和eureka等相關信息:配置文件如下:
spring:
application:
name: provider
cloud:
inetutils:
preferred-networks: 192.168.1.
server:
port: 8082
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8081/eureka
instance:
prefer-ip-address: true
instance-id: 192.168.1.5:${server.port}
運行啟動類,可以在eureka的頁面上看到一個名為provider的服務已經注冊上去了:
服務的消費方:
服務的消費方也是和服務提供方一樣,也會到Eureka中去注冊,按照上邊的步驟,我們新建一個consumer項目,比前邊的provider多加上Feign的依賴
在啟動類上邊,多加兩個注解:
@EnableFeignClients
@EnableDiscoveryClient
啟動類的代碼如下:
package com.jiaoyiping.springcloud.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
新建一個ProductControllerRemote接口,作為FeignClient,里邊定義的方法和服務提供方的方法一致;
package com.jiaoyiping.springcloud.consumer;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "provider")
public interface ProductControllerRemote {
@RequestMapping(value = "/add/{a}/{b}")
String add(@PathVariable("a") int a, @PathVariable("b") int b);
}
@FeignClient注解的name,指的是注冊到eureka上的應用的名稱(在服務提供方的spring的配置文件里配置) 接口的方法映射到服務提供方的相應的方法上,只需要定義,不需要實現,Feign會自動調用服務提供方的相應的方法
使用@FeignClient注解的這個類,可以作為一個spring的bean,注入到需要的地方去,直接調用相應的方法即可
作為例子,我們在消費方新定義一個Controller,來調用ProductControllerRemote:
package com.jiaoyiping.springcloud.consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerController {
@Autowired
private ProductControllerRemote productControllerRemote;
@RequestMapping("/getresult/{a}/{b}")
public String getResult(@PathVariable("a") int a, @PathVariable("b") int b) {
return productControllerRemote.add(a, b);
}
}
然后是消費方的配置文件,需要配置Eureka的地址和服務的端口等信息:
spring:
application:
name: cunsumer
cloud:
inetutils:
preferred-networks: 192.168.1.
server:
port: 8083
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8081/eureka/
instance:
prefer-ip-address: true
instance-id: 192.168.1.5:${server.port}
啟動消費方的啟動類,可以看到,消費方也被注冊到Eureka中去了:
使用postman調用消費方對外提供的接口,我們可以看到,消費方調用了服務提供方提供的服務,正確的返回了結果: