一、簡介
註冊中心Eureka架構圖如下:
分別是註冊中心(Eureka)、服務提供(Service Provider)和服務消費(Service Consumer),後兩者均爲註冊到註冊中心的服務,因調用關係不同而身份不同,不同的業務場景下身份可能會互換。
二、主要內容
1、服務提供者
結構如下:
HelloController
添加註解@RestController
,核心代碼如下
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String index(String name) {
return "hello "+name+",this is first messge";
}
@RequestMapping(value = "/foo")
public String foo(String foo) {
return "hello "+foo+",this is first messge";
}
application.yml
配置文件
spring:
application:
name: spring-cloud-provider
server:
port: 9000
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
pom.xml
文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lxt</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.lxt</groupId>
<artifactId>service-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-provider</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
2、服務消費者
結構如下,暫時忽略hystrix
包
HelloRemote
代碼
@Component
public class HelloRest {
@Autowired
private RestTemplate restTemplate;
public String hello(String name){
String response = restTemplate.getForObject("http://spring-cloud-provider/foo?foo="+name,String.class);
return response;
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
ConsumerController
核心代碼
@RestController
public class ConsumerController {
@Autowired
private HelloRest helloRest;
@RequestMapping("/hello/{name}")
public String index(@PathVariable("name") String name) {
return helloRest.hello(name);
}
@RequestMapping("/test")
public String test() {
return "test success!";
}
}
application.yml
配文件
spring:
application:
name: spring-cloud-consumer
server:
port: 9001
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
pom.xml
文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lxt</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.lxt</groupId>
<artifactId>service-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-consumer</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<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>
</dependencies>
</project>
三、結果演示
- 分別啓動註冊中心、服務提供者和服務消費者,如下圖
- 調用服務消費者測試
- 瀏覽器輸入http://localhost:9001/hello/lxt
- 返回hello lxt,this is first messge
,測試成功
四、整合Feign實現負載均衡
簡介
Fegin是Netfix開發的聲明式、模板化的HTTP客戶端,Spring Cloud 對Fegin進行了增強,使Fegin支持了Spring MVC註解,並整合了Ribbon和Eureka,從而讓Fegin的使用更加方便。
Ribbon是基於Netfix發佈的客戶端負載均衡器,默認提供了輪詢、隨機等負載均衡算法,開發者也可以自定義負載均衡算法。
Eureka Server 和 Fegin整合使用大致架構如下
實現負載均衡
-
依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
啓動類添加註解
@EnableFeignClients
啓用feign進行遠程調用@SpringBootApplication @EnableDiscoveryClient//啓用服務註冊與發現 @EnableFeignClients//啓用feign進行遠程調用 public class ServiceConsumerApplication { public static void main(String[] args) { SpringApplication.run(ServiceConsumerApplication.class, args); } }
-
使用
@FeignClient
實現負載均衡// name:配置服務提供者名稱,用於從註冊中心獲取服務提供者信息 @FeignClient(name= "spring-cloud-provider") public interface HelloFegin { @RequestMapping(value = "/hello") public String hello(@RequestParam(value = "name") String name); }
-
複製
service-provider
,重命名service-provider1
-
修改配置文件端口爲9002
-
修改
HelloController.index
返回值爲"hello "+name+",this is two messge"
如下圖:
-
註冊中心
-
多次測試
http://localhost:9001/hello/lxt
分別返回hello lxt,this is first messge
和hello lxt,this is two messge