• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • springCloud學習【一】:服務的注冊發現與消費【實例】

    標簽: springCloud學習  Java學習之路  spring boot  cloud  后端  spring

    個人學習記錄而已,沒事就回來看看,給自己漲記性

    不做名詞解釋,各種名詞解釋百度一堆堆
    文章總結寫在末尾點個贊鼓勵一下?
    文章有點長,目錄是個好東西啊
    哪里不對留言討論,拜托描述清楚
    廢話連篇:凡心所向,素履所往;

    準備:新建一個空的maven項目用來當父項目【CloudDemo】我就是拿他當個根目錄而已

    新建空的maven父項目
    在這里插入圖片描述

    一、項目準備:CloudDemo僅當作父項目使用【各個項目的根目錄而已】

    1、刪除沒用的東西
    2、maven配置
    3、編譯jdk設置
    4、項目編碼設置
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

    二、創建注冊中心模塊cloud-registry SpringBoot項目

    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    注冊中心選擇的eureka Server 其他的依賴 個人習慣dev和lombok 然后一路下一步完成

    完整項目結構:

    在這里插入圖片描述
    cloud-registry-pom.xml內容【默認最新的springCloud版本,Hoxton.SR8】

    <?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 https://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.3.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.crazy</groupId>
        <artifactId>cloud-registry</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>cloud-registry</name>
        <description>注冊中心模塊</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    項目依賴
    在這里插入圖片描述

    三、注冊中心的配置【yml格式】

    在這里插入圖片描述

    server:
      port: 8770  #端口
      application:
        name: Eureka-Registry #當前模塊項目的服務名稱
    
    eureka:
      client:
        register-with-eureka: false #是否將自己注冊到Eureka Server
        fetch-registry: false #是否從Eureka Server獲取注冊信息
        service-url:
          defaultZone: http://localhost:${server.port}/eureka/   #當前注冊中心的地址,其他的服務需要注冊到這里
    

    啟動類增加Eureka的配置注解 @EnableEurekaServer 注解解釋 :**eureka的服務器配置
    在這里插入圖片描述

    四、搞定,注冊中心就這么就沒球了,啟動點個贊鼓勵一下?

    在這里插入圖片描述
    訪問路徑localhost:8770即可打開Eureka的管理界面【直接IP:端口就可以,不用加/eureka】
    后面注冊進來的服務會在Instances currently registered with Eureka展示
    在這里插入圖片描述

    五、去搞一個服務cloud-service【服務提供者】注冊到eureka中,SpringBoot項目

    還是新建一個moudle,依賴選擇Eureka Discovery Client
    在這里插入圖片描述
    在這里插入圖片描述
    pom.xml內容添加了web依賴

    <?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 https://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.3.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.crazy</groupId>
        <artifactId>cloud-service</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>cloud-service</name>
        <description>服務提供者,只提供接口服務</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.3.4.RELEASE</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    六、服務提供者service的配置

    在這里插入圖片描述

    server:
      port: 8771 #設置服務提供者的端口號
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8770/eureka/  #注冊到那里的注冊中心
          
    spring:
      application:
        name: Eureka-Service  #這個項目模塊所提供服務的名稱
    

    在啟動類上添加注解 @EnableEurekaClient
    這里有點迷,最后的總結里面有說明

    在這里插入圖片描述

    七、依次啟動

    在這里插入圖片描述
    先啟動registry 然后再啟動 service

    再次打開Eureka的管理界面localhost:8770

    可以發現服務提供者已經注冊到注冊中心了

    在這里插入圖片描述
    點個贊鼓勵一下?

    八、服務注冊了, 提供兩個接口用來消費(調用)

    給他提供兩個最簡單的服務接口

    1、接收一個參數返回一個字符串
    2、接收一個參數返回一個實體

    啟動類同級創建包,然后就是web開發的路子controller和service和mapper和pojo(moudle,entity)實體層和工具啊配置啊啥的各種包路徑

    在這里插入圖片描述

    package com.crazy.controller;
    
    import com.crazy.pojo.User;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Description 提供兩個簡單的服務
     * @Author Crazy
     * @Date 2020/10/10 14:52
     * @Copyright
     */
    @RestController
    @RequestMapping("/test")
    public class TestController {
        /**
         * 接口服務一
         */
        @RequestMapping("/string")
        public String hello(String str) {
            System.out.println(">>>>>>進入/test/string>>>>>>傳入的值:" + str );
            //service層和impl以及mapper層略過
    
            return "你好:" + str;
        }
    
        /**
         * 接口服務二
         */
        @RequestMapping("/getUser")
        public User getUser() {
            System.out.println(">>>>>>進入/test/getUser");
            //service層和impl以及mapper層略過
            User u = new User();
            u.setId(1);
            u.setUserName("瘋瘋顛顛");
            u.setPassword("Crazy123");
            return u;
        }
    
    }
    
    

    在這里插入圖片描述
    重新啟動cloud-service 測試
    在這里插入圖片描述
    測試:編碼也好,瀏覽器也好,我用的postman
    在這里插入圖片描述
    在這里插入圖片描述

    九、搞定,在弄個服務消費者cloud-consume SpringBoot項目

    新建一個模塊moudle【服務消費者cloud-consume】
    依賴如下
    在這里插入圖片描述
    項目配置文件
    在這里插入圖片描述

    server:
      port: 8772 #設置服務提供者的端口號
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8770/eureka/  #注冊到那里的注冊中心
    
    spring:
      application:
        name: Eureka-Consume  #這個項目模塊所提供服務的名稱
    

    服務消費調用的方式有很多點個贊鼓勵一下?

    1、第一種直接調用 不經過注冊中心需要一個RestTemplate的客戶端

    在這里插入圖片描述
    源碼解釋為客戶端負載均衡器
    在這里插入圖片描述

    package com.crazy.beans;
    
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @Description TODO
     * @Author Crazy
     * @Date 2020/10/10 15:35
     * @Copyright
     */
    @Configuration
    public class Beans {
    
        @Bean
        @LoadBalanced //標記一個RestTemplate為客戶端負載均衡
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
    
    

    controller直接調用的,沒有走本模塊的service以及mapper層

    在這里插入圖片描述

    package com.crazy.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @Description 消費者調用服務Demo
     * @Author Crazy
     * @Date 2020/10/10 15:14
     * @Copyright
     */
    @RestController
    @RequestMapping("/consume")
    public class ConsumeController {
    
        /**
         * 第一種消費調用服務的方式
         */
        @RequestMapping("/one")
        public String helloWorld(String s) {
            System.out.println("進入/consume/one>>>>>>傳入的值為:" + s);
    
            String One = new RestTemplate().getForObject("http://localhost:8771/test/string?str=" + s, String.class);
            System.out.println("第一種>>>>>>:"+One);
    
    
            return ">>>>>>調用返回的是:"+One;
        }
    
    }
    
    

    啟動cloud-consume項目 消費者也到注冊中心了

    在這里插入圖片描述

    測試

    在這里插入圖片描述
    消費者控制臺打印的信息

    在這里插入圖片描述
    服務提供者控制臺打印的信息

    在這里插入圖片描述
    調用實體返回值 這里只在控制臺打印,沒有返回實體

    在這里插入圖片描述
    打印信息

    在這里插入圖片描述

    2、第二種消費方式【根據服務名 獲取服務列表 訪問某個服務的網絡位置】

    在這里插入圖片描述

        @Autowired
        private LoadBalancerClient loadBalancerClient;
        
    	 /**
         * 第二種消費調用服務方式:根據服務名 獲取服務列表 并訪問某個服務的網絡位置。
         */
        @RequestMapping("/two")
        public String helloTwo(String s){
            System.out.println("進入/consume/two>>>>>>傳入的值為:" + s);
    
            RestTemplate restTemplate = new RestTemplate();
            //獲取服務信息
            ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
            String Two = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/test/string?str="+s,String.class);
    
            //getForObject也可以返回實體數據  區別:直接返回請求的body里面的實體
            User user = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/test/getUser?str=" + s, User.class);
            System.out.println(">>>>>>調用返回的實體數據:" + user.toString());
    
    
            return ">>>>>>調用返回的是:" + Two;
        }
    

    測試
    在這里插入圖片描述
    控制臺信息
    在這里插入圖片描述
    在這里插入圖片描述

    3、第三種Ribbon+restTemplate注入的方式

    控制層
    在這里插入圖片描述
    service層
    在這里插入圖片描述
    service實現層執行調用消費服務
    在這里插入圖片描述
    service實現層代碼

    package com.crazy.service.impl;
    
    import com.crazy.pojo.User;
    import com.crazy.service.ConsumeService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @Description TODO
     * @Author Crazy
     * @Date 2020/10/10
     * @Copyright
     */
    @Service
    public class ConsumeServiceImpl implements ConsumeService {
    
        @Autowired
        private RestTemplate rest;
    
        @Override
        public String testResult(String s) {
            //restTemplate的對GET請求進行調用的兩種請求方式 一
            String str = rest.getForObject("http://EUREKA-SERVICE/test/string?str={1}", String.class,s);
    
            //restTemplate的對GET請求進行調用的兩種請求方式 二  上面的方式也可以響應為實體
            ResponseEntity<User> forEntity = rest.getForEntity("http://EUREKA-SERVICE/test/getUser", User.class);
            System.out.println(">>>>>>測試getForEntity返回值:"+forEntity.getBody());
    
            //其他還有POST的各種API以后慢慢測試
    
            return str;
        }
    }
    
    

    測試
    在這里插入圖片描述
    控制臺打印信息

    在這里插入圖片描述
    在這里插入圖片描述
    beans也可以直接寫道啟動類中加載
    在這里插入圖片描述

    十、復制幾個服務實現調用

    注冊中心現有的服務有

    兩個,一個服務提供者,一個服務消費者。多搞幾個服務提供者玩玩?
    服務層增加點東西,打印一下,每個服務的端口信息

    在這里插入圖片描述
    在這里插入圖片描述
    然后把服務多復制兩個出來通過VM命令改一下端口
    在這里插入圖片描述
    選中service直接復制
    在這里插入圖片描述
    點擊復制出來的服務Environment 分別去修改這兩個復制出來的服務的端口號 -Dserver.port=8773這里一個8773一個8774

    現有的端口號
    8770 注冊中心
    8771 服務提供者
    8772 服務消費者
    8773-8774是復制出來的兩個服務提供者

    完了之后點擊-應用-OK
    在這里插入圖片描述
    服務全部重啟:順序 registry-service-service01-service-02-consume 也就是一個注冊中心,三個服務提供者,一個服務消費者
    eureka管理界面中顯示service服務有三個了,端口分別是8774-8771-8773 但是名字一樣
    在這里插入圖片描述
    再來測試消費的方式123,就3吧

    在這里插入圖片描述
    控制臺信息
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    three的請求,方法內部調用了兩次服務,一次進了8774,一次進了8773,8773沒有打印,所以頁面只顯示8774,多來幾次
    在這里插入圖片描述
    在這里插入圖片描述

    如果停掉其中一個服務節點,那么就會導致33%的請求會失敗。這個問題需要熔斷器來解決,后面寫好了再來補充


    本次demo知識點總結

    1、服務的注冊發現與消費至少三個模塊,分別為注冊中心。服務提供者。服務消費者。依次按順序啟動。
    2、可以對注冊中心以及服務提供者分別進行負載均衡。通過配置文件修改端口即可實現。
    3、服務消費者對服務的調用消費:Ribbon+RestTemplate是一種客戶端負載均衡的消費服務的方式,還有一種消費方式:feign,也是基于ribbon實現需要自己創建一個接口注入到Beans,并且feign集成了ribbon,結合了eureka,默認實現了負載均衡。
    4、關于注解@EnableEurekaClient 不加也可以,應該是新版cloud的特性,個人不太確定,沒找到官方解釋。源碼注釋也說是可選的。個人認為是通過配置文件生效的。
    5、yml中配置的信息,注冊中心指定注冊中心的地址,服務提供者注冊到注冊中心指定的地址完成服務注冊,服務消費者指定注冊中心的地址用來獲取服務。
    6、倆個注解:@EnableDiscoveryClient和@EnableEurekaClient的效果一樣,用哪個取決于用什么注冊中心,如果選用的注冊中心是eureka,那么就推薦@EnableEurekaClient,如果是其他的注冊中心,那么推薦使用@EnableDiscoveryClient【但是這吊玩意可選的。。】

    未完待續——如果看到這里了,(●'?'●)該去點贊了啊喂

    有空寫完其他的服務相關的再來補充,啥玩意路由啊,斷路器啊,消息總線啊,服務鏈路啊啥的。

    版權聲明:本文為m0_48373030原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/m0_48373030/article/details/108995078

    智能推薦

    SpringCloud教程(一)服務的注冊與發現(Eureka)

    1、環境介紹:     開發工具idea、基于springboot2.0.3和springcloud Finchley。 2、創建服務注冊中心       采用Eureka作為服務注冊與發現的組件       新建springboot項目,項目名eureka       pom.xml文件...

    springcloud光速入門(一) 服務的注冊與發現

    springcloud光速入門 簡單概述 springcloud看上去很難,很恐怖,但是我一遍學下來,感覺還是蠻容易的,面向配置編程,這一篇主要是講配置,細節可能比較少。首先我們的微服務應該有以下部分: 服務注冊中心 簡單說一下,服務注冊中心就是我們的一個類,可以有很多方法,但是我們的方法只能被我們同一個項目中的其他類調用,或者說我電腦上寫了一個類,有很多方法,但是我沒辦法讓另一臺電腦調用這個方法...

    SpringCloud (一)、服務注冊與發現

    微服務架構 “微服務架構” 在之前幾年就很火爆了,以至于現在關于微服務的文章很多,資料也是海量,社區同樣也是很活躍。 微服務架構 的兩大主流 應該就是SpringCloud 與 dubbo 了。 說了那么多,微服務是什么呢? 簡單的說,微服務架構就是將一個完整的應用垂直拆分成多個不同的服務,每個服務都是一個個體,可以獨立部署、獨立維護、獨立擴展、服務與服務之間 通過諸如RE...

    SpringCloud(一) eureka服務注冊與發現

    一、 Eureka介紹 Eureka是一個基于REST(Representational State Transfer)的服務,主要用于AWS cloud, 提供服務定位(locating services)、負載均衡(load balancing)、故障轉移(failover of middle-tier servers)。我們把它叫做Eureka Server. Eureka也提供了基于Jav...

    SpringCloud(一):Eureka服務注冊與發現

    Eureka是Netflix開源的一款提供服務注冊和發現的產品,是springCloud體系中最重要最核心的組件之一。 Eureka作為SpringCloud的注冊中心,主要負責服務的注冊與發現; 每個微服務都是一個Eureka client組件,負責將該服務根據id、ip和端口注冊到Eureka Server中; Eureka Server是一個注冊中心,該組件內部維護了一個注冊表,保存了各個服...

    猜你喜歡

    SpringCloud學習(一)入門服務的注冊、發現、調用

    服務的注冊與發現 注冊中心(eureka server) 使用eureka作為注冊中心。 創建eureka-service工程 創建工程,選擇Spring Initializ如下圖 下一步->選擇cloud discovery->eureka server ,然后一直下一步就行了。 配置server eureka是一個高可用的組件,它沒有后端緩存,每一個實例注冊之后需要向注冊中心發送心...

    SpringCloud——服務的注冊與發現Eureka

    一、spring cloud簡介          Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線)。分布式系統的協調導致了樣板模式, 使用Spring Cloud開發人員可以快速地支持實現這些模式的服務和應用程序。他們將在任何分布式環境中運行良好,包括開發...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡