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

互聯(lián)網(wǎng)大廠(chǎng)技術(shù)-HTTP請(qǐng)求-Springboot整合Feign更優(yōu)雅地實(shí)現(xiàn)Http服務(wù)調(diào)用

這篇具有很好參考價(jià)值的文章主要介紹了互聯(lián)網(wǎng)大廠(chǎng)技術(shù)-HTTP請(qǐng)求-Springboot整合Feign更優(yōu)雅地實(shí)現(xiàn)Http服務(wù)調(diào)用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

@feignclient http請(qǐng)求,http,java,網(wǎng)絡(luò)協(xié)議

目錄

一、SpringBoot快速整合Feign

1.添加Pom依賴(lài)

2.啟動(dòng)類(lèi)添加注解

3.引用Feign服務(wù)

二、為請(qǐng)求添加Header的3種方式

1.添加固定header

2.通過(guò)接口簽名添加header

3.動(dòng)態(tài)添加header

三、為請(qǐng)求添加超時(shí)配置

1.默認(rèn)超時(shí)時(shí)間

3.超時(shí)異常

4.全局超時(shí)配置

5.為單個(gè)服務(wù)設(shè)置超時(shí)配置

四、為請(qǐng)求配置客戶(hù)端負(fù)載均衡模式

五、Feign日志

1.日志級(jí)別

2.日志配置類(lèi)

3.配置文件

六、高階配置

七、Feign與Springboot版本

八、技術(shù)問(wèn)題

no suitable HttpMessageConverter found for response type



本章內(nèi)容講解重點(diǎn)目標(biāo)以及面向用戶(hù)

本章目標(biāo)

了解feign的原理

掌握f(shuō)eign的使用

學(xué)會(huì)feign多種header的設(shè)置方式

學(xué)會(huì)feign日志控制

了解feign高階配置項(xiàng)

其他開(kāi)發(fā)注意事項(xiàng)

面向用戶(hù) 初、中、高階的研發(fā)同學(xué)

很多時(shí)候,我們查看一些高階架構(gòu)同學(xué)在寫(xiě)Http服務(wù)調(diào)用時(shí),調(diào)試跟蹤代碼時(shí)發(fā)現(xiàn)就只有接口簽名,沒(méi)有想okhttp那樣寫(xiě)一些調(diào)用過(guò)程的代碼,代碼看起來(lái)風(fēng)格清爽、優(yōu)雅并不失邏輯嚴(yán)謹(jǐn),讀完該篇文章,您會(huì)掌握其實(shí)現(xiàn)方案,并提供demo協(xié)助您完成實(shí)戰(zhàn),有技術(shù)問(wèn)題可以私信請(qǐng)教;

一、SpringBoot快速整合Feign

1.添加Pom依賴(lài)

 <properties>
        <spring-cloud-feign.version>3.1.3</spring-cloud-feign.version>
    </properties>

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.7.10</version>
</parent>
<dependencies>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
   <version>${spring-cloud-feign.version}</version>
</dependency>
</dependencies>

2.啟動(dòng)類(lèi)添加注解

@EnableFeignClients

3.引用Feign服務(wù)

@RestController
@RequestMapping("/stock")
public class StockController {

    @Autowired
    private LocalFeignService service;

    @GetMapping("/get")
    public String get(){
        service.add("10");
        return "Hello world";
    }
}

二、為請(qǐng)求添加Header的3種方式

1.添加固定header

@RestController
public class HomeController {

    @Resource
    private FeignClientService feignClientService;

    

    @RequestMapping(value = "/add")
    public String add(@RequestBody FeignReq req) {
        return "ok";
    }

   
    @RequestMapping("/test-add")
    public Object testAdd() {
        FeignReq req = new FeignReq();
        req.setId(System.currentTimeMillis());
        return feignClientService.add(req);
    }

}

在@PostMapping注解的headers參數(shù)中添加固定的header值,也包括一些從配置文件讀取的配置項(xiàng)作為header值

@Component
@FeignClient(name = "feignClientService", url = "http://localhost:8081")
public interface FeignClientService {

    @PostMapping(value = "/add", headers = {"Authorization=myFeignSignToken", "Content-Type=text/plain", "App=${my.name}"})
    public String add(@RequestBody FeignReq req);

}

瀏覽器訪(fǎng)問(wèn):http://localhost:8081/test-add

2.通過(guò)接口簽名添加header

@RestController
public class HomeController {



    @Resource
    private FeignClientService feignClientService;


    @PostMapping(value = "/query")
    public String query(@RequestParam("queryName") String queryName) {

        return queryName + "ok";
    }


    @RequestMapping("/test-query")
    public Object testQuery() {
        Map<String, String> map = new HashMap<>();
        map.put("token", "ikong_token"+System.currentTimeMillis());
        return feignClientService.query("ikong", map);
    }

}

重點(diǎn)是在Map類(lèi)型的headers,這里通過(guò)接口簽名的@RequestHeader注解將Map對(duì)象轉(zhuǎn)化成請(qǐng)求header

@Component
@FeignClient(name = "feignClientService", url = "http://localhost:8081", configuration = TestRequestInterceptor.class)
public interface FeignClientService {

    @PostMapping(value = "/query")
    public String query(@RequestParam("queryName") String queryName, @RequestHeader Map<String, String> headers);

}

瀏覽器訪(fǎng)問(wèn):http://localhost:8081/test-query

3.動(dòng)態(tài)添加header

@RestController
public class HomeController {


    @Resource
    private FeignClientService feignClientService;

    @RequestMapping("/search")
    public Object search(@RequestBody FeignReq req) {
        return "ok";
    }

   
    @RequestMapping("/test-search")
    public Object testSearch() {
        FeignReq req = new FeignReq();
        req.setId(System.currentTimeMillis());
        return feignClientService.search(req);
    }


}

@Component
@FeignClient(name = "feignClientService", url = "http://localhost:8081", configuration = TestRequestInterceptor.class)
public interface FeignClientService {


    @PostMapping("/search")
    public String search(@RequestBody FeignReq req);

}

通過(guò)FeignClient注解注入configuration = TestRequestInterceptor.class,在TestRequestInterceptor實(shí)現(xiàn)header動(dòng)態(tài)添加能力


public class TestRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        template.header(HttpHeaders.AUTHORIZATION, createApiSign());
    }

    /**
     * 創(chuàng)建接口簽名
     *
     * @return
     */
    private String createApiSign() {
        return UUID.randomUUID().toString();
    }

}

瀏覽器訪(fǎng)問(wèn):http://localhost:8081/test-search

三、為請(qǐng)求添加超時(shí)配置

1.默認(rèn)超時(shí)時(shí)間

connectiontimeout : 10s,readtimeout : 60s

  public static class Options {
 
    private final int connectTimeoutMillis;
    private final int readTimeoutMillis;
 
    public Options(int connectTimeoutMillis, int readTimeoutMillis) {
      this.connectTimeoutMillis = connectTimeoutMillis;
      this.readTimeoutMillis = readTimeoutMillis;
    }
 
    public Options() {
      this(10 * 1000, 60 * 1000);
    }
 
    /**
     * Defaults to 10 seconds. {@code 0} implies no timeout.
     *
     * @see java.net.HttpURLConnection#getConnectTimeout()
     */
    public int connectTimeoutMillis() {
      return connectTimeoutMillis;
    }
 
    /**
     * Defaults to 60 seconds. {@code 0} implies no timeout.
     *
     * @see java.net.HttpURLConnection#getReadTimeout()
     */
    public int readTimeoutMillis() {
      return readTimeoutMillis;
    }
  }

3.超時(shí)異常

exception:feign.RetryableException: connect timed out executing POST http://xxx.ik.com/your/api

4.全局超時(shí)配置

feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=5000

5.為單個(gè)服務(wù)設(shè)置超時(shí)配置

@feignclient http請(qǐng)求,http,java,網(wǎng)絡(luò)協(xié)議

?要實(shí)現(xiàn)不同服務(wù)配備不同的超時(shí)時(shí)間,可按如下配置進(jìn)行

feign.client.config.yourService.connectTimeout=5
feign.client.config.yourService.readTimeout=5

四、為請(qǐng)求配置客戶(hù)端負(fù)載均衡模式

OpenFeign只是一種Rest客戶(hù)端,本身不具備任何的負(fù)載均衡操作。?OpenFeign底層調(diào)用的還是Netflix Ribbon負(fù)載均衡組件,那我們?cè)谑褂肙penFeign實(shí)現(xiàn)服務(wù)調(diào)用時(shí),如何修改負(fù)載均衡策略呢?

自定義Ribbon的負(fù)載均衡配置

@Configuration
// name為服務(wù)名
@RibbonClient(name = "my-provider", configuration = MyLoadBalanceConfiguration.class)
public class MyLoadBalanceConfiguration {

    @Bean
    public IRule ribbonRule() {
        return new RandomRule(); // 采用隨機(jī)策略
    }
}

我們這里使用的是隨機(jī)策略,默認(rèn)為輪詢(xún)策略。

Ribbon提供可選負(fù)載均衡分類(lèi)

  1. 隨機(jī)策略——RandomRule
  2. 輪詢(xún)策略——RoundRobinRule?注:Ribbon默認(rèn)策略
  3. 重試策略——RetryRule
  4. 最低并發(fā)策略——BestAvailableRule
  5. 可用過(guò)濾策略——AvailabilityFilteringRule、過(guò)濾掉那些因?yàn)橐恢边B接失敗的被標(biāo)記為circuit tripped的后端server,并過(guò)濾掉那些高并發(fā)的的后端server(active connections 超過(guò)配置的閾值),性能僅次于最低并發(fā)策略。
  6. 響應(yīng)時(shí)間加權(quán)策略——WeightedResponseTimeRule,每隔30秒計(jì)算一次服務(wù)器響應(yīng)時(shí)間,以響應(yīng)時(shí)間作為權(quán)重,響應(yīng)時(shí)間越短的服務(wù)器被選中的概率越大。
  7. 區(qū)域權(quán)衡策略——ZoneAvoidanceRule

Ribbon的負(fù)載均衡策略使用建議
一般情況下,推薦使用最低并發(fā)策略,這個(gè)性能比默認(rèn)的輪詢(xún)策略高很多。

五、Feign日志

feign的日志是建立在 debug日志模式的基礎(chǔ)上的,不管是全局配置還是局部配置,代碼配置還是屬性配置,都需要先把日志模式調(diào)成debug模式:(下面與調(diào)用FeignClientService接口的日志模式為例)

1.日志級(jí)別

OpenFeign的日志級(jí)別有

  • NONE: 默認(rèn)的,不顯示任何日志。

  • BASIC: 僅記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)碼以及執(zhí)行時(shí)間。

  • HEADERS:除了BASIC 中自定義的信息外,還有請(qǐng)求和響應(yīng)的信息頭。

  • FULL: 除了HEADERS中定義的信息外, 還有請(qǐng)求和響應(yīng)的正文以及元數(shù)據(jù)。

2.日志配置類(lèi)

@Configuration
public class OpenFeignLogConfig {
  @Bean
  Logger.Level feignLoggerLevel(){
    return Logger.Level.FULL;
  }
}

3.配置文件

logging:
  level:
  *[feign日志以什么級(jí)別監(jiān)控哪個(gè)接口]:
  com.ik.ikong.service.FeignClientService: debug

六、高階配置

七、Feign與Springboot版本

版本對(duì)照關(guān)系如下,詳情也可以點(diǎn)擊這里的鏈接在官網(wǎng)查看最新版本兼容關(guān)系

@feignclient http請(qǐng)求,http,java,網(wǎng)絡(luò)協(xié)議

八、技術(shù)問(wèn)題

在調(diào)用接口時(shí)候idea報(bào)錯(cuò)

no suitable HttpMessageConverter found for response type

解決過(guò)程

1.放開(kāi)日志

@Configuration
public class FeignConfiguration {

    @Bean
    public feign.Logger logger() {
        return new Slf4jLogger();
    }
    @Bean
    public Logger.Level level() {
        return Logger.Level.FULL;
    }
}
logging:
  level:
    feign.Logger: debug

日志詳細(xì)

@feignclient http請(qǐng)求,http,java,網(wǎng)絡(luò)協(xié)議

從放開(kāi)的日志來(lái)看,接口返回的head里:content-type: text/html; charset=UTF-8

雖然我在接口簽名上增加了produces、consumes

@PostMapping(value = "/xxxxx/your/api", produces = "application/json;charset=utf-8", consumes = "application/json;charset=utf-8")

可以看到毫無(wú)效果,仍舊異常:no suitable HttpMessageConverter found for response type

猜想原生的http返回值只對(duì)application/json類(lèi)型做了泛型的反序列化處理,是對(duì)接口返回的content-type: text/html;并不能進(jìn)行json反序列化處理,遂增加該類(lèi)型的json反序列化處理;

@Bean
    public HttpMessageConverters customConverters() {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML,MediaType.APPLICATION_JSON));
        return new HttpMessageConverters(false, Arrays.asList(mappingJackson2HttpMessageConverter, new StringHttpMessageConverter()));
    }

重點(diǎn)在mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML,MediaType.APPLICATION_JSON));

最后成功完成增加content-type: text/html的json反序列化;

參考:Spring Cloud

Feign實(shí)現(xiàn)服務(wù)間的Http調(diào)用。_feign http調(diào)用_半命i的博客-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-767092.html

到了這里,關(guān)于互聯(lián)網(wǎng)大廠(chǎng)技術(shù)-HTTP請(qǐng)求-Springboot整合Feign更優(yōu)雅地實(shí)現(xiàn)Http服務(wù)調(diào)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SpringBoot整合Spring Data Elasticsearch,寫(xiě)給互聯(lián)網(wǎng)大廠(chǎng)員工的真心話(huà)

    SpringBoot整合Spring Data Elasticsearch,寫(xiě)給互聯(lián)網(wǎng)大廠(chǎng)員工的真心話(huà)

    @RunWith(SpringRunner.class) @SpringBootTest(classes = ItcastElasticsearchApplication.class) public class IndexTest { @Autowired private ElasticsearchTemplate elasticsearchTemplate; //注入ElasticsearchTemplate類(lèi) @Test public void testCreate(){ // 創(chuàng)建索引,會(huì)根據(jù)Item類(lèi)的@Document注解信息來(lái)創(chuàng)建 elasticsearchTemplate.createIndex(Item.class)

    2024年04月14日
    瀏覽(23)
  • 互聯(lián)網(wǎng)大廠(chǎng)技術(shù)-elasticsearch(es)- 在數(shù)據(jù)量很大的情況下(數(shù)十億級(jí)別)提高查詢(xún)效率

    互聯(lián)網(wǎng)大廠(chǎng)技術(shù)-elasticsearch(es)- 在數(shù)據(jù)量很大的情況下(數(shù)十億級(jí)別)提高查詢(xún)效率

    互聯(lián)網(wǎng)大廠(chǎng)技術(shù)-elasticsearch(es)- 在數(shù)據(jù)量很大的情況下(數(shù)十億級(jí)別)提高查詢(xún)效率 目錄 一、問(wèn)題分析 二、問(wèn)題剖析 三、性能優(yōu)化的殺手锏(filesystem cache) 四、數(shù)據(jù)預(yù)熱 五、冷熱分離 六、document 模型設(shè)計(jì) 七、分頁(yè)性能優(yōu)化 八、解決方案 這個(gè)問(wèn)題是肯定要問(wèn)的,說(shuō)白了,就

    2024年02月04日
    瀏覽(26)
  • 盤(pán)點(diǎn)互聯(lián)網(wǎng)大廠(chǎng)的元宇宙布局

    盤(pán)點(diǎn)互聯(lián)網(wǎng)大廠(chǎng)的元宇宙布局

    導(dǎo)讀: 頭部互聯(lián)網(wǎng)公司的元宇宙布局。 作者:成生輝 來(lái)源:大數(shù)據(jù)DT(ID:hzdashuju) 圖1.17用雷達(dá)圖展示了目前五個(gè)頭部科技巨頭公司對(duì)元宇宙的布局情況。布局分成 數(shù)字金融 、 穿戴設(shè)備 (包括AR/VR及傳感器等)、 Adtech (主要做內(nèi)容及營(yíng)銷(xiāo))、 去中心化平臺(tái) 、 軟件技術(shù)

    2023年04月22日
    瀏覽(25)
  • 激斗云計(jì)算:互聯(lián)網(wǎng)大廠(chǎng)打響新一輪排位戰(zhàn)

    激斗云計(jì)算:互聯(lián)網(wǎng)大廠(chǎng)打響新一輪排位戰(zhàn)

    大模型如同一輛時(shí)代列車(chē),所有科技大廠(chǎng)都想上車(chē)。 自去年底ChatGPT一炮而紅,國(guó)內(nèi)外數(shù)十家科技大廠(chǎng)、創(chuàng)業(yè)公司、機(jī)構(gòu)相繼下場(chǎng),一時(shí)間掀起大模型的熱浪。 《中國(guó)人工智能大模型地圖研究報(bào)告》顯示,截至今年5月28日,中國(guó)10億參數(shù)規(guī)模以上的大模型已發(fā)布79個(gè),中美兩國(guó)

    2024年02月16日
    瀏覽(27)
  • 36歲互聯(lián)網(wǎng)高管從大廠(chǎng)裸辭,專(zhuān)門(mén)賣(mài)書(shū)快樂(lè)多了

    大家好,我是老洪。 今天分享的是一位互聯(lián)網(wǎng)高管裸辭賣(mài)書(shū)的創(chuàng)業(yè)故事。 吳主任,今年37歲,來(lái)自福建莆田,大學(xué)畢業(yè)后,寫(xiě)過(guò)文案、賣(mài)過(guò)保險(xiǎn)、開(kāi)過(guò)網(wǎng)店擺過(guò)攤。 他與李誕羅永浩是多年好友,機(jī)緣巧合留在北京當(dāng)起了互聯(lián)網(wǎng)的內(nèi)容編輯,12年一路打拼,成為了互聯(lián)網(wǎng)大廠(chǎng)的

    2024年02月06日
    瀏覽(26)
  • 互聯(lián)網(wǎng)大廠(chǎng)職級(jí)和薪資一覽表!看看WebGIS能到多少級(jí)?

    互聯(lián)網(wǎng)大廠(chǎng)職級(jí)和薪資一覽表!看看WebGIS能到多少級(jí)?

    以上薪資來(lái)源網(wǎng)絡(luò),僅供參考。 我們?cè)賮?lái)看下這些大廠(chǎng)在招的webgis崗位薪資: 13-26K,經(jīng)驗(yàn)不限 勉強(qiáng)能夠上13級(jí) 13-35K,3-5年工作經(jīng)驗(yàn) 范圍挺大的,最高薪資水平差不多在8級(jí)以?xún)?nèi) 30-60K,3-5年經(jīng)驗(yàn),差不多等于P5-P7水平。 25-50K,1-3年工作經(jīng)驗(yàn),跨度較大,差不多在T3-T7之間。

    2024年02月20日
    瀏覽(26)
  • 2023Java崗面試,進(jìn)互聯(lián)網(wǎng)大廠(chǎng)必備Java面試八股文真題解析

    2023Java崗面試,進(jìn)互聯(lián)網(wǎng)大廠(chǎng)必備Java面試八股文真題解析

    前言 一般技術(shù)面試官都會(huì)通過(guò)自己的方式去考察程序員的技術(shù)功底與基礎(chǔ)理論知識(shí)。 很多時(shí)候,面試官問(wèn)的問(wèn)題會(huì)和自己準(zhǔn)備的“題庫(kù)”中的問(wèn)題不太一樣,即使做了復(fù)盤(pán),下次面試還是不知道該從何處下手。 為此鄙人軟磨硬泡才把阿里P8專(zhuān)門(mén)歸納整理的 《Java進(jìn)階知識(shí)典藏

    2023年04月10日
    瀏覽(28)
  • 2023Java 崗面試,進(jìn)互聯(lián)網(wǎng)大廠(chǎng)必備 Java 面試八股文真題解析

    2023Java 崗面試,進(jìn)互聯(lián)網(wǎng)大廠(chǎng)必備 Java 面試八股文真題解析

    前言 一般技術(shù)面試官都會(huì)通過(guò)自己的方式去考察程序員的技術(shù)功底與基礎(chǔ)理論知識(shí)。 很多時(shí)候,面試官問(wèn)的問(wèn)題會(huì)和自己準(zhǔn)備的“題庫(kù)”中的問(wèn)題不太一樣,即使做了復(fù)盤(pán),下次面試還是不知道該從何處下手。 為此鄙人軟磨硬泡才把阿里 P8 專(zhuān)門(mén)歸納整理的 《Java 進(jìn)階知識(shí)典

    2024年02月15日
    瀏覽(35)
  • Selenium超級(jí)詳細(xì)的教程_selenium怎么運(yùn)行,寫(xiě)給互聯(lián)網(wǎng)大廠(chǎng)員工的真心話(huà)

    Selenium超級(jí)詳細(xì)的教程_selenium怎么運(yùn)行,寫(xiě)給互聯(lián)網(wǎng)大廠(chǎng)員工的真心話(huà)

    在這個(gè)示例中,我們使用了WebDriver的 get() 方法來(lái)打開(kāi)指定的網(wǎng)頁(yè)。您可以傳遞一個(gè)URL作為參數(shù),WebDriver將會(huì)在瀏覽器中加載該URL對(duì)應(yīng)的頁(yè)面。您還可以打開(kāi)本地文件,只需傳遞一個(gè)以 file:// 開(kāi)頭的文件路徑作為參數(shù)。 4. 頁(yè)面操作 一旦您打開(kāi)了網(wǎng)頁(yè),您就可以使用WebDriver來(lái)模

    2024年04月16日
    瀏覽(40)
  • 兩個(gè)通宵熬出來(lái)的互聯(lián)網(wǎng)大廠(chǎng)最新面試題收集整理1000道(二-ElasticSearch),歡迎點(diǎn)贊收藏!!!

    兩個(gè)通宵熬出來(lái)的互聯(lián)網(wǎng)大廠(chǎng)最新面試題收集整理1000道(二-ElasticSearch),歡迎點(diǎn)贊收藏!!!

    先自我介紹一下,小編浙江大學(xué)畢業(yè),去過(guò)華為、字節(jié)跳動(dòng)等大廠(chǎng),目前阿里P7 深知大多數(shù)程序員,想要提升技能,往往是自己摸索成長(zhǎng),但自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前! 因此收集整理了一份《2024年最新Java開(kāi)發(fā)全套學(xué)習(xí)資料》,

    2024年04月26日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包