1. 程式人生 > >SpringBoot,SpringCloud,Docker構建微服務學習筆記

SpringBoot,SpringCloud,Docker構建微服務學習筆記

SpringCloud與阿里巴巴的dubbo都是實現微服務架構的基礎框架,由與我在學習的時候是提供SpringBoot來嘗試構建微服務,因此我使用了SpringCloud。
SpringCloud的子專案非常多,在最開始學習微服務的第一步只需要學會微服務的服務註冊,服務發現,服務呼叫等三塊,使用Spring Cloud Netflix足以,至於zookeeper後面自然會介紹。

備註:Spring Cloud Netflix是Spring Cloud的子專案之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模組並構建龐大的分散式系統。它主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路有(Zuul),客戶端負載均衡(Ribbon)等。

微服務搭建第一步:服務註冊中心

服務註冊中心即對於系統中的服務有一個統一的管理。所有的服務都需要在註冊中心註冊,這樣服務消費者呼叫服務的時候就用註冊中心查詢,查詢到具體服務提供者的資訊(ip地址,埠等)從而發起RPC呼叫。
使用Spring Cloud Netflix完成服務註冊中心
pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId
>
<version>1.3.5.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId
>
</dependency> </dependencies>

Main.java

@EnableEurekaServer
@SpringBootApplication
public class Main {
        public static void main(String[] args) {
            new SpringApplicationBuilder(Main.class).web(true).run(args);
        }
}

同時需要寫一個SpringBoot配置檔案:

server.port=8080
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

對於上述操作,大部分都是SpringBoot相關的知識。但有幾點需要強調一下:

  • 一定要在主類中新增@EnableEurekaServer註解來開啟服務註冊功能
  • 在配置檔案中eureka.client.serviceUrl.defaultZone的值一定是專案url/eureka。否則服務無法被註冊
  • 配置檔案中的其餘兩個配置是讓伺服器不要把自身當成服務提供者。遺忘服務提供者也是通過eureka.client.serviceUrl.defaultZone來註冊服務的。

通過Maven打包為jar包後,構建Docker容器:

Dockerfile:

FROM registry.cn-hangzhou.aliyuncs.com/alirobot/oraclejdk8-nscd #基礎源
add springCloudOne.jar app.jar #傳遞jar包
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
#執行命令

不難看出,此時沒有任何服務去註冊。

微服務搭建第二步:服務提供者

建立好服務註冊中心後,下一步便建立服務提供者。即然是第一個服務例子,為了方便大家理解,我們建立一個很簡單的服務:接受使用者傳遞的姓名,然後返回hello,xxx。

 public String sayHello(String name) {
        String result = "Hello ,"+name;
        return result;
    }

建立SpringBoot專案,新增服務提供者依賴:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>

Main.java:

@EnableDiscoveryClient
@SpringBootApplication
@ComponentScan("xxx")
public class Application {
    public static void main(String[] args){
        SpringApplication.run(Application.class, args);
    }
}

通過@EnableDiscoveryClient來表面服務提供者。
SayHello.java(提供服務的核心類):

@RestController
public class SayHello {
    private final Logger logger = Logger.getLogger(getClass());
    @Autowired
    private DiscoveryClient client;
    @RequestMapping(value = "/sayHello" ,method = RequestMethod.GET)
    public String sayHello(@RequestParam String name) {
        ServiceInstance instance = client.getLocalServiceInstance();
        String r = "hello,"+name;
        logger.info("/add, host:" + instance.getHost() + ", service_id:" + instance.getServiceId() + ", result:" + r);
        return r;
    }
}

不難看出,微服務的服務提供者提供了RestAPI介面。其中我們使用了DiscoveryClient類(服務呼叫者資訊)列印日誌。
最後依然是配置檔案:application.properties

spring.application.name=say-hello
server.port=8081
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka

上述的配置檔案中,有幾點要強調一哈:

  • spring.application.name在這裡變成了標誌服務的名稱,在眾多服務中它的名稱必須唯一(當然同一服務的叢集自然是相同的)
  • eureka.client.serviceUrl.defaultZone標誌服務註冊中心的地址

如果要構建該服務的叢集,其餘的全部不變,修改配置檔案的埠即可。假設我們有建立了一個上述服務,埠為8082。
與上述一致,構建Docker 指定埠,執行。
此時訪問localhost:8080則會看到我們註冊的服務。
這裡寫圖片描述

微服務搭建第三步:服務消費者

服務提供者建立成功後,自然需要呼叫才行,現在建立服務消費者來呼叫say-hello這個服務:
前面提到,Spring Cloud Netflix子專案包含了Ribbon。它就是來完成服務消費者的。

Ribbon

Ribbon是一個基於HTTP和TCP客戶端的負載均衡器.
Ribbon可以在通過客戶端中配置的ribbonServerList服務端列表去輪詢訪問以達到均衡負載的作用。
當Ribbon與Eureka聯合使用時,ribbonServerList會被DiscoveryEnabledNIWSServerList重寫,擴充套件成從Eureka註冊中心中獲取服務端列表。同時它也會用NIWSDiscoveryPing來取代IPing,它將職責委託給Eureka來確定服務端是否已經啟動。

建立專案實戰如何使用Ribbon來呼叫服務,並實現客戶端對於say-hello的負載均衡:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
   </dependencies>

Main.java:

@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan("xxx")
public class Main {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

建立RestTemplate例項,並通過@LoadBalanced註解開啟均衡負載能力。
建立一個Service,這個Service就是最終呼叫服務提供者的:

@Service
public class RibbonService {
    @Autowired
    RestTemplate restTemplate;

    public String sayHelloService() {
        return restTemplate.getForEntity("http://SAY-HELLO/sayHello?name=jackman", String.class).getBody();
    }
}

建立一個Controller。使用者最終呼叫該Controller:

@RestController
public class ConsumerRibbonController {
  @Autowired
  public RibbonService service;

    @RequestMapping(value = "/sayInRibbon", method = RequestMethod.GET)
    public String add() {
        return service.addService();
    }

}

同理配置application.properties:

spring.application.name=ribbon-consumer
server.port=9090
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/

與上述一致,構建該Docker容器,並啟動由於我們指定了埠9090,此時在localhost:8080中可以看的該服務呼叫者:

此時我們在瀏覽器上訪問:

http://127.0.0.1:9090/sayInRibbon

訪問可以看的:”hello,jackman”.而訪問兩次,則會看的在兩個say-hello服務提供者容器中各列印了一次。
這裡寫圖片描述
這裡寫圖片描述
Feign
Feign其實是包含了Ribbon,使用與上述稍有不同

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>

Main.java

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

Feign有個好處就是支援註解:
Service.java

@FeignClient(value = "say-hello")
public interface FeignConsumer {
    @RequestMapping(method = RequestMethod.GET, value = "/sayHello")
    String say(@RequestParam(value = "name") String name);
}

建立對外提供Controller:

@RestController
public class FeignConsumerController {
    @Autowired
    public FeignConsumer feignConsumer;

    @RequestMapping(value = "/addInFeign", method = RequestMethod.GET)
    public Integer add() {
        return feignConsumer.say("jack");
    }

}

與上述一樣,構建Docker,觀察訪問結果也與使用Ribbon時一致,說明Feign預設支援負載均衡呼叫。

至於兩者的區別,後面會詳細介紹的。

相關推薦

SpringBootSpringCloudDocker構建服務學習筆記

SpringCloud與阿里巴巴的dubbo都是實現微服務架構的基礎框架,由與我在學習的時候是提供SpringBoot來嘗試構建微服務,因此我使用了SpringCloud。 SpringCloud的子專案非常多,在最開始學習微服務的第一步只需要學會微服務的服務

實戰:基於spring cloud + docker構建服務

系列 速度 oss 分享 -s 本地 border 檢查 pad 本系列記錄學習 spring-cloud-microservice-example的實戰過程,並對利用spring cloud + docker 構建端到端的微服務架構技術進行解析。0.安裝前的準備,下列軟件

使用Spring Cloud和Docker構建服務架構

如何使用Spring Boot、Spring Cloud、Docker和Netflix的一些開源工具來構建一個微服務架構。本文通過使用Spring Boot、Spring Cloud和Docker構建的概念型應用示例,提供了了解常見的微服務架構模式的起點。 該程式碼可以在GitHub上(https

如何在Python中使用ZeroMQ和Docker構建服務架構

ati 包含 file 更多 定價 lean https 目前 端口 @Container容器技術大會將於6月4日在上海光大會展中心國際大酒店舉辦,來自攜程、PPTV、螞蟻金服、京東、浙江移動、海爾電器、唯品會、eBay、道富銀行、麻袋理財等公司的技術負責人將帶來實踐經驗分

服務學習筆記(1)--springboot

Spring Boot HelloWorld 瀏覽器傳送 hello 請求,伺服器接受請求並處理,響應 Hello World 字串; 1.  建立一個 maven 工程;(jar) 2.  匯入 spring boot 相關的依賴 <parent> <

springCloud服務學習筆記

        雖然入行已有4載,但所學甚淺,涉獵的技術雖然繁多,但不得其精妙所在,如若不是為了繼續生存,可能自己早已隨波逐流,哪還能有心思在這寫部落格。雖已過五五之數,但也算及時悔悟,驚若心中存有夢,唯有沉澱免自辱。          在程式設計師這條路上,必定是沒有風平

SpringCloud服務學習筆記

utm edi 自我保護 發現 mic 拒絕 連接失敗 標簽 res SpringCloud微服務學習筆記 項目地址: https://github.com/taoweidong/Micro-service-learning 單體架構(Monolithic架構) Mono

服務學習筆記系列-Spring Cloud優質項目推薦

微服務Spring Cloud微服務架構集大成者,雲計算最佳業務實踐。image.pngSpring CloudSpring Cloud ConfigSpring配置管理工具包,讓你可以把配置放到遠程服務器,集中化管理集群配置,目前支持本地存儲、Git以及Subversion。Spring Cloud Bus

從0開始學服務學習筆記

1到底什麼是微服務 單體應用 部署效率低 團隊協作開發成本高 系統高可用性差 線上釋出變慢 什麼是服務化 單體應用中通過jar包依賴產生的本地方法呼叫,改成通過RPC遠端方法呼叫

服務學習筆記(4)--Hystrix服務的降級限流和熔斷

分散式系統中,會出現哪些問題? 分散式系統中一定會遇到的一個問題:服務雪崩效應 或者叫級聯效應 那麼什麼是服務雪崩效應呢? 在一個高度服務化的系統中,我們實現的一個業務邏輯通常會依賴多個服務,比如:商品詳情展示服務會依賴商品服務, 價格服務, 商品評論服務. 如圖所示: 呼叫

服務學習筆記--使用Spring Cloud Sleuth配合Zipkin實現服務的跟蹤

在微服務架構中可以使用Zipkin來追蹤服務呼叫鏈路,可以知道各個服務的呼叫依賴關係。在Spring Cloud中,也提供了Spring Cloud Sleuth來方便整合Zipkin實現。 本文使用一個Zipkin Server,使用者微服務,電影微服務來實現

服務學習筆記(二):Spring Cloud

2. Spring Cloud Spring Cloud作為Java語言的微服務框架,依賴於Spring Boot,具有快速開發、持續交付、易於部署等特點。 2.1 微服務應該具備的功能 微服務的特點: 按照業務劃分服務。每個微服務執行在獨立的程序中,有獨立的

服務學習筆記--使用Spring Boot Actuator監控端點

目錄 前言 微服務的這種架構雖然解決了單體應用的一些劣勢,但它也面臨一些挑戰,比如對運維的要求更高了。一個微服務架構中可能有幾十個上百個應用構成,要保證這些應用都正常執行,相互協調是比較麻煩的事情,因此我們需要一個元件來對這些應用進行監控和管理

服務學習筆記---什麼是服務

本篇為學習《Spring Cloud與Docker微服務架構實戰》的筆記。要理解什麼是微服務,我們首先談談單體應用架構。單體應用就是包含所有功能的應用程式,而架構單體應用程式的方法論就是單體應用架構。以一個電影系統為例,如下圖:單體應用架構的專案一般比較簡單,業務相對沒那麼複

服務學習筆記(1)——使用MagicOnion實現gRPC

tco cred time sharp ref 服務端 eve rpo 實現接口 1.什麽是gRPC 官方文檔:https://grpc.io/docs/guides/index.html 2.什麽是MagicOnion MagicOnion開源地址:https://git

服務學習筆記(2)——使用Consul 實現 MagicOnion(GRpc) 服務註冊和發現

我會 names uid red mes tar art ret public 原文:微服務學習筆記(2)——使用Consul 實現 MagicOnion(GRpc) 服務註冊和發現1.下載打開Consul 筆者是windows下面開發的(也可以使用Docker)。 官

服務學習筆記(三):開發環境準備

3. 開發環境準備 JDK安裝部署 下載安裝JDK安裝包,設定JAVA_HOME、PATH環境變數。 IDEA安裝 Jetbrains官網下載Ultimate版本。 使用IDEA新建Spri

從 0 開始的服務架構:(五)代碼給你看如何用Docker支撐服務

這一 復用 微軟 .com 擴展 版本發布 生產 通信 ibm 很好的一篇文章,全面、系統。 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就

14套java精品高級架構課Dubbo分布式Restful 服務並發原理編程SpringBootSpringCloudRocketMQ中間件視頻教程

工資 tac ini ati album rii fms ont html 14套java精品高級架構課,緩存架構,深入Jvm虛擬機,全文檢索Elasticsearch,Dubbo分布式Restful 服務,並發原理編程,SpringBoot,SpringCloud,Ro

SpringCloud系列-使用SpringBoot Admin構建服務監控

簡介 Spring Boot Admin 用於管理和監控一個或者多個Spring Boot 程式。 Spring Boot Admin 分 為 Server 端和 Client 端, Client 端可以通過 Http 向 Server 端註冊,也可以結合 Spring Cloud