1. 程式人生 > >spring cloud深入學習(三)-----服務消費

spring cloud深入學習(三)-----服務消費

key request configure bsp 簡單 zone 維護 地址 發送

在上一篇博文中簡單實現了eureka-server以及eureka-provider,後面會實現eureka-cosumer,現在針對eureka做進一步的詳解。

微服務整體架構

文字再美也沒有圖片直觀,下面通過一張圖來說明微服務的整體架構以及調用過程,如下:

技術分享圖片

服務註冊中心-1和服務註冊中心-2互相組成了高可用集群;
服務提供者啟動了兩個實例,一個註冊到服務註冊中心-1上,另外一個註冊到服務註冊中心-2上;
兩個服務消費者,也都分別指向了一個註冊中心。

服務提供者

1、服務註冊

服務提供者在啟動的時候發送rest請求將自己註冊到eureka-server上,包括自己的元數據,eureka-server會將相關數據存為兩層map,第一層的key為服務名,第二層的key則為具體服務的實例名。

2、服務同步

兩個服務提供者分別註冊到了兩個不同的服務註冊中心上,並且這兩個服務註冊中心互相註冊,因此當服務提供者發送註冊請求到一個服務註冊中心時,它會將該請求轉發到集群中相連的其他註冊中心,從而實現服務同步。

3、服務續約

當服務提供者註冊到服務註冊中心之後,服務提供者會維護一個心跳,需要定期的告訴註冊中心,我是有效的,沒有掛掉。否則不續約的話,註冊中心就會將服務提供者幹掉。

# 定義服務續約任務的調用間隔時間,默認30秒
eureka.instance.lease-renewal-interval-in-seconds=30
# 定義服務失效的時間,默認90秒
eureka.instance.lease
-expiration-duration-in-seconds=90

服務消費者

在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務調用方式,一種是ribbon+restTemplate,另一種是feign。

1、ribbon

ribbon是一個負載均衡客戶端,可以很好的控制http和tcp的一些行為。Feign默認集成了ribbon。

2、新建一個eureka-consumer工程

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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ty</groupId> <artifactId>eureka-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-consumer</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RELEASE</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

運行主類:

package com.ty.eurekaconsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class EurekaConsumerApplication {

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

}

application.properties

# 服務名稱
spring.application.name=eureka-consumer
# 端口號
server.port=3001
# 服務註冊中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

controller:

package com.ty.eurekaconsumer.controller;

import com.ty.eurekaconsumer.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RibbonController {

    @Autowired
    RibbonService ribbonService;

    @GetMapping("/ribbonService")
    public String hi(@RequestParam String name) {

        return ribbonService.hiService( name );
    }
}

service:

package com.ty.eurekaconsumer.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.client.RestTemplate;

@Service
public class RibbonService {

    @Autowired
    private RestTemplate restTemplate;

    public String hiService(String name) {
        return restTemplate.getForObject("http://eureka-provider/firstCall?name="+name, String.class);
    }
}

運行效果:

瀏覽器中輸入:http://localhost:3001/ribbonService?name=馬雲

技術分享圖片

本人已將eureka-server、eureka-provider、eureka-consumer代碼上傳到github中地址如下

eureka-server地址:https://github.com/ali-mayun/eureka-server

eureka-provider地址: https://github.com/ali-mayun/eureka-provider

eureka-consumer地址:https://github.com/ali-mayun/eureka-consumer

有需要的可以自行下載,另外方便的話,給個小星星哦!!!

spring cloud深入學習(三)-----服務消費