国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Cloud 之注冊中心 Eureka 精講

這篇具有很好參考價值的文章主要介紹了Spring Cloud 之注冊中心 Eureka 精講。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?? 簡介:java系列技術(shù)分享(??持續(xù)更新中…??)
?? 初衷:一起學(xué)習(xí)、一起進步、堅持不懈
?? 如果文章內(nèi)容有誤與您的想法不一致,歡迎大家在評論區(qū)指正??
?? 希望這篇文章對你有所幫助,歡迎點贊 ?? 收藏 ?留言 ??

?? 更多文章請點擊
Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,javaSpring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java


Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

一、Eureka簡介

Spring Cloud官網(wǎng):https://spring.io/projects/spring-cloud
Eureka官網(wǎng):https://github.com/Netflix/eureka

Spring Cloud 是目前用于開發(fā)微服務(wù)的主流框架之一,我們都知道在微服務(wù)架構(gòu)中最為基礎(chǔ)、核心的模塊,就是服務(wù)注冊與發(fā)現(xiàn)。

Spring Cloud 封裝了 Netflix 公司開發(fā)的 Eureka 模塊來實現(xiàn) 服務(wù)注冊和發(fā)現(xiàn)。Eureka Server 作為 服務(wù)注冊中心,系統(tǒng)中的 其他微服務(wù),使用 Eureka 的 客戶端 連接到 Eureka Server,并通過 心跳連接 檢測服務(wù)的 存活狀態(tài)

Eureka 包含兩個組件:Eureka ServerEureka Client

  • Eureka Server: 作為 服務(wù)注冊中心,提供 服務(wù)注冊和發(fā)現(xiàn),提供服務(wù)注冊服務(wù),各個節(jié)點啟動后,會在 EurekaServer 中進行注冊,這樣 EurekaServer 中的服務(wù)注冊表中將會存儲所有可用服務(wù)節(jié)點的信息。

  • Eureka Client: 所有注冊到 服務(wù)中心 的服務(wù)。是一個 Java 客戶端,用于簡化 Eureka Server 的交互,客戶端同時也具備一個內(nèi)置的、使用輪詢 (round-robin) 負(fù)載算法的負(fù)載均衡器。在應(yīng)用啟動后,將會向 Eureka Server 發(fā)送心跳 (默認(rèn)周期為 30 秒)。

    • Service Provider: 把 自身的服務(wù) 注冊到 Eureka Server,從而使 服務(wù)消費方 能夠找到。
    • Service Consumer: 從 Eureka Server 獲取 服務(wù)注冊列表,從而能夠 消費服務(wù)。

二、 Eureka 注冊中心

在微服務(wù)架構(gòu)中往往會有一個注冊中心,每個微服務(wù)都會向注冊中心去注冊自己的地址及端口信息,注冊中心維護著服務(wù)名稱與服務(wù)實例的對應(yīng)關(guān)系。首先我們注冊中心服務(wù)端:eureka-server,這必須是一個獨立的微服務(wù)。下面我們來搭建搭建 eureka-server。

原始http服務(wù)調(diào)用 -存在問題:

  • 如果有多個服務(wù)提供者,消費者如何選擇?
  • 消費者如何獲取服務(wù)提供者地址信息?
  • 如何知曉服務(wù)提供者是否健康?

請看下圖

(純手工繪制有點瑕疵)Eureka的作用 圖解:

Eureka的作用-圖解

Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

2.1 首先基于Spring Boot創(chuàng)建父工程

以Maven模塊化項目方式創(chuàng)建,便于各個微服務(wù)的項目管理。
Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

2.1.1 需要注意(重要)

來自Spring Cloud官方文檔 :https://spring.io/projects/spring-cloud

概述了Spring Cloud的版本與Spring Boot的版本對應(yīng)關(guān)系,需要注意最新更新可查看官方文檔

Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

2.1.2 本項目引入主要配置

父項目Pom文件

可以看到下文中:Spring Boot的版本是2.7.1
因此根據(jù)上圖Spring Cloud 的版本為:2021.0.1
Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

第一種 (選擇一種即可,區(qū)別不大)

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/>
    </parent>
    
	<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <hutool.version>5.8.2</hutool.version>
    </properties>
    
    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <!-- springCloud -->
        <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>
第二種

不引入parent也可以這樣配置


	<properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.7.1</spring-boot.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <hutool.version>5.8.2</hutool.version>
    </properties>
    
    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    
 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
 </dependencyManagement>

兩種都可以

2.2 搭建Eureka-Server

  1. 在父工程基礎(chǔ)上 創(chuàng)建eureka-server模塊`
  2. 引入spring-cloud-starter-netflix-eureka-server依賴
        <!--eureka 服務(wù)端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
  1. 在啟動類上添加@EnableEurekaServer注解
  2. 添加配置
server:
  port: 10086
spring:
  application:
    name: eureka-server
  main:
    allow-bean-definition-overriding: true
eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:10086/eureka/
  #  register-with-eureka: false # 不注冊自己
  #  fetch-registry: false #不拉取服務(wù)

  1. 啟動服務(wù)
    然后訪問:http://localhost:10086/
    看到如下頁面則成功
    Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

2.3 搭建Eureka-Client(服務(wù)注冊)

將provider-service注冊到Eureka-Server中步驟如下:

  1. 在父工程基礎(chǔ)上 創(chuàng)建provider-service模塊(服務(wù)提供者)
  2. 引入spring-cloud-starter-netflix-eureka-client依賴,注意后綴是client
        <!--eureka 客戶端 -->
		<dependency>
		    <groupId>org.springframework.cloud</groupId>
		    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
  1. 添加配置
server:
  port: 20086
spring:
  application:
    name: provider-service
  main:
    allow-bean-definition-overriding: true
eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:10086/eureka/
  1. 同理創(chuàng)建consumer-service模塊(服務(wù)消費者)

  2. 最終項目結(jié)構(gòu)如下圖所示:

    我這里創(chuàng)建了個common公共包,無要求,非必須
    Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

2.4 服務(wù)拉取準(zhǔn)備工作

2.4.1 需求

需求:根據(jù)訂單id查詢訂單的同時查詢對應(yīng)用戶信息一起返回

消費者中提供訂單信息 提供者提供用戶信息 數(shù)據(jù)在各自對應(yīng)數(shù)據(jù)庫中

2.4.2 數(shù)據(jù)庫表數(shù)據(jù)展示

order訂單表
Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java
用戶表
Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

2.4.3 消費者端

  1. controller
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    /**
     * 消費者
     */
    @Autowired
    private ConsumerService consumerService;
    
    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        // 根據(jù)id查詢訂單并返回
        return consumerService.queryOrderById(orderId);
    }
}
  1. service
public interface ConsumerService {

    /**
     * 根據(jù)id查詢訂單并返回
     */
    Order queryOrderById(Long orderId);
}

  1. impl
@Service
public class ConsumerServiceImpl implements ConsumerService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;
    /**
     * 根據(jù)id查詢訂單并返回
     */
    @Override
    public Order queryOrderById(Long orderId) {
        // 1.查詢訂單
        Order order = orderMapper.findById(orderId);

        //2遠(yuǎn)程查詢用戶信息
        String url="http://localhost:20086/provider/"+order.getUserId();
        
        //2. 發(fā)起調(diào)用
        User user = restTemplate.getForObject(url, User.class);
        //3. 存入order
        order.setUser(user);

        // 4.返回
        return order;
    }
}

  1. mapper
@Mapper
public interface OrderMapper {

    @Select("select id, name, num, user_id userId, price from `order` where id = #{id}")
    Order findById(Long orderId);
}

  1. 啟動類,并配置RestTemplate
@SpringBootApplication
public class ConsumerApplication {

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

    /**
     * 沒有實例化RestTemplate時,初始化RestTemplate
     * @return
     */
    @ConditionalOnMissingBean(RestTemplate.class)
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

2.4.4 提供者端

  1. controller
@RestController
@RequestMapping("/provider")
public class ProviderController {

    @Autowired
    private ProviderService providerService;


    /**
     * 根據(jù)id查詢用戶信息
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return providerService.queryById(id);
    }

}
  1. service
public interface ProviderService {

    /**
     * 根據(jù)id查詢用戶信息
     */
    User queryById(Long id);
}


  1. impl
@Service
public class ProviderServiceImpl implements ProviderService {

    @Autowired
    private UserInfoMapper userMapper;

    /**
     * 根據(jù)id查詢用戶信息
     */
    @Override
    public User queryById(Long id) {
        return userMapper.findById(id);
    }
}
  1. mapper
@Mapper
public interface UserInfoMapper {
    
    @Select("select * from user where id = #{id}")
    User findById(@Param("id") Long id);
}
  1. 啟動類
@SpringBootApplication
public class ProviderApplication {

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

2.4.5 注冊成功

Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

三、服務(wù)啟動測試

3.1 原始http全路徑調(diào)用 及 存在問題

查看上文代碼消費者端是基于全路徑http://localhost:20086/provider/1 調(diào)用

		//2遠(yuǎn)程查詢用戶信息
        String url="http://localhost:20086/provider/"+order.getUserId();

成功調(diào)用如下圖
Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

存在問題:

  • 如果有多個服務(wù)提供者,消費者如何選擇?
  • 消費者如何獲取服務(wù)提供者地址信息?
  • 如何知曉提供者是否健康 ?

可參考上文------Eureka的作用 圖解

3.2 使用Eureka注冊中心的服務(wù)名調(diào)用

這是成功注冊的服務(wù)

基于服務(wù)名稱獲取服務(wù)列表,然后對服務(wù)列表做負(fù)載均衡

Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

  1. 服務(wù)名代替ip,端口

  2. 使用provider-service(自己配置的服務(wù)名)代替localhost:20086

           //2遠(yuǎn)程查詢用戶信息
            String url="http://provider-service/provider/"+order.getUserId();
    
    
  3. 在服務(wù)消費者的啟動類的RestTemplate添加@LoadBalanced負(fù)載均衡注解

    負(fù)載均衡詳解后續(xù)文章中更新

        /**
         * 沒有實例化RestTemplate時,初始化RestTemplate
         * @return
         */
        @ConditionalOnMissingBean(RestTemplate.class)
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    

測試結(jié)果成功
Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java

四、總結(jié)

4.1 Eureka的作用

  • 消費者該如何獲取服務(wù)提供者具體信息?

    • 服務(wù)提供者啟動時向eureka注冊自己的信息
    • eureka保存這些信息
    • 消費豬根據(jù)服務(wù)名稱向eureka拉取提供者信息
  • 如果有多個服務(wù)提供者,消費者該如何選擇?

    • 服務(wù)消費者利用負(fù)載均衡算法,從服務(wù)列表中選擇一個
  • 消費者如何感知服務(wù)提供者健康狀態(tài)?

    • 服務(wù)提供者會每隔30秒向EurekaServer發(fā)送心跳請求,報告健康狀態(tài)
    • eureka會更新記錄服務(wù)列表信息,心跳不正常會被剔除
    • 消費者就可以拉取到最新的信息

4.2 在Eureka架構(gòu)中,微服務(wù)角色有兩類:

  • EurekaServer: 服務(wù)端,注冊中心
    • 記錄服務(wù)信息
    • 心跳監(jiān)控
  • Eurekaclient:客戶端
    • Provider: 服務(wù)提供者,例如案例中的provider-service
      • 注冊自己的信息到EurekaServer
      • 每隔30秒向EurekaServer發(fā)送心跳
    • consumer:服務(wù)消費者,例如案例中的 consumer-service
      • 根據(jù)服務(wù)名稱從EurekaServer拉取服務(wù)列表
      • 基于服務(wù)列表做負(fù)載均衡,選中一個微服務(wù)后發(fā)起遠(yuǎn)程調(diào)用

Spring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,javaSpring Cloud 之注冊中心 Eureka 精講,Spring Cloud,eureka,spring cloud,java文章來源地址http://www.zghlxwxcb.cn/news/detail-530340.html

到了這里,關(guān)于Spring Cloud 之注冊中心 Eureka 精講的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 客快物流大數(shù)據(jù)項目(一百一十三):注冊中心 Spring Cloud Eureka

    客快物流大數(shù)據(jù)項目(一百一十三):注冊中心 Spring Cloud Eureka

    文章目錄 注冊中心 Spring Cloud Eureka 一、Eureka 簡介 二、架構(gòu)圖

    2023年04月25日
    瀏覽(91)
  • Spring Cloud Eureka:服務(wù)注冊與發(fā)現(xiàn)

    Spring Cloud Eureka:服務(wù)注冊與發(fā)現(xiàn)

    ??wei_shuo的個人主頁 ??wei_shuo的學(xué)習(xí)社區(qū) ??Hello World ! Spring Cloud Eureka是Spring Cloud生態(tài)系統(tǒng)中的一個組件,它是用于實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)的服務(wù)治理組件。在微服務(wù)架構(gòu)中,服務(wù)之間存在復(fù)雜的依賴關(guān)系,而Spring Cloud Eureka可以幫助解決服務(wù)之間相互查找和通信的問題 Eurek

    2024年02月09日
    瀏覽(89)
  • Eureka:Spring Cloud服務(wù)注冊與發(fā)現(xiàn)組件

    Eureka:Spring Cloud服務(wù)注冊與發(fā)現(xiàn)組件

    Eureka 一詞來源于古希臘詞匯,是“發(fā)現(xiàn)了”的意思。在軟件領(lǐng)域,Eureka 是 Netflix 公司開發(fā)的一款開源的服務(wù)注冊與發(fā)現(xiàn)組件。 Spring Cloud 將 Eureka 與 Netflix 中的其他開源服務(wù)組件(例如 Ribbon、Feign 以及 Hystrix 等)一起整合進 Spring Cloud Netflix 模塊中,整合后的組件全稱為 Spr

    2024年02月03日
    瀏覽(94)
  • 理解 Spring Cloud 分布式配置中心Eureka

    作者:禪與計算機程序設(shè)計藝術(shù) 在 Spring Cloud 的世界里,分布式系統(tǒng)經(jīng)歷了開發(fā)、測試、運維三個階段。而在開發(fā)階段,通常采用集中式配置方式,將所有配置文件統(tǒng)一管理在一臺服務(wù)器上。隨著業(yè)務(wù)系統(tǒng)的不斷擴張,各個微服務(wù)模塊都需要配置自己的屬性值。因此,需要一

    2024年02月08日
    瀏覽(98)
  • 【spring cloud學(xué)習(xí)】2、Eureka服務(wù)注冊與發(fā)現(xiàn)

    【spring cloud學(xué)習(xí)】2、Eureka服務(wù)注冊與發(fā)現(xiàn)

    一套微服務(wù)架構(gòu)的系統(tǒng)由很多單一職責(zé)的服務(wù)單元組成,而每個服務(wù)單元又有眾多運行實例。由于各服務(wù)單元顆粒度較小、數(shù)量眾多,相互之間呈現(xiàn)網(wǎng)狀依賴關(guān)系,因此需要服務(wù)注冊中心來統(tǒng)一管理微服務(wù)實例,維護各服務(wù)實例的健康狀態(tài)。 從宏觀角度,微服務(wù)架構(gòu)下的系統(tǒng)

    2024年02月10日
    瀏覽(230)
  • 【Spring Cloud 三】Eureka服務(wù)注冊與服務(wù)發(fā)現(xiàn)

    【Spring Cloud 三】Eureka服務(wù)注冊與服務(wù)發(fā)現(xiàn)

    【Spring Cloud一】微服務(wù)基本知識 目前公司項目使用的注冊中心主要是Spring Cloud Alibaba的Nacos做的注冊中心和配置中心。之前也是對Nacos的基本原理通過手寫代碼的方式進行了實現(xiàn)。出于對于Eureka的好奇所以就對Spring Cloud Neflix的Eureka進行理論學(xué)習(xí)和實踐。 Eureka是一個 注冊發(fā)現(xiàn)中

    2024年02月14日
    瀏覽(986)
  • Spring Cloud之一:注冊與發(fā)現(xiàn)-Eureka工程的創(chuàng)建

    Spring Cloud之一:注冊與發(fā)現(xiàn)-Eureka工程的創(chuàng)建

    ??系列目錄(持續(xù)更新。。。) Spring Cloud:什么是微服務(wù) Spring Cloud之一:注冊與發(fā)現(xiàn)-Eureka工程的創(chuàng)建 Spring Cloud之二:服務(wù)提供者注冊到Eureka Server Spring Cloud之三:Eureka Server添加認(rèn)證 Spring Cloud 之四:使用Feign實現(xiàn)微服務(wù)間的交互 Spring Cloud 之五:Feign使用Hystrix 目錄 環(huán)境 E

    2023年04月09日
    瀏覽(92)
  • 深入了解Spring Cloud的服務(wù)注冊與發(fā)現(xiàn)組件Eureka

    深入了解Spring Cloud的服務(wù)注冊與發(fā)現(xiàn)組件Eureka

    摘要:Spring Cloud是一個基于Spring框架的開發(fā)工具包,可以幫助開發(fā)人員構(gòu)建基于微服務(wù)架構(gòu)的分布式系統(tǒng)。其中的核心組件之一是Eureka,它提供了一套強大的服務(wù)注冊與發(fā)現(xiàn)功能。本文將深入介紹Spring Cloud中的Eureka組件,包括其背景、特性、工作原理以及與其他Spring Cloud組件

    2024年02月13日
    瀏覽(93)
  • Spring Cloud - Eureka原理、注冊、搭建、應(yīng)用(全過程詳解)

    Spring Cloud - Eureka原理、注冊、搭建、應(yīng)用(全過程詳解)

    目錄 一、Eureka 注冊原理 1.1、為什么要使用 Eureka 1.2、Eureka 的工作流程及原理 1.3、eureka 的作用 二、具體實現(xiàn) 2.1、搭建注冊中心 2.2、服務(wù)注冊和部署 2.2.1、user-service 服務(wù)注冊 2.2.2、服務(wù)部署 2.2.3、order-service 服務(wù)注冊 2.2.4、驗證服務(wù) 2.3、服務(wù)發(fā)現(xiàn) 2.3.1、在order-service完成服務(wù)

    2024年02月11日
    瀏覽(294)
  • Spring Cloud(Finchley版本)系列教程(一) 服務(wù)注冊與發(fā)現(xiàn)(eureka)

    Spring Cloud(Finchley版本)系列教程(一) 服務(wù)注冊與發(fā)現(xiàn)(eureka)

    Spring Cloud(Finchley版本)系列教程(一) 服務(wù)注冊與發(fā)現(xiàn)(eureka) 為了更好的瀏覽體驗,歡迎光顧勤奮的凱爾森同學(xué)個人博客http://www.huerpu.cc:7000 如有錯誤懇請大家批評指正,與大家共同學(xué)習(xí)、一起成長,萬分感謝。 一、構(gòu)建環(huán)境 Spring Cloud 的構(gòu)建工具可以使用 Maven 或 Gradle ,但 Ma

    2024年02月09日
    瀏覽(100)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包