springcloud之自定義簡易消費服務元件

2021-09-20 08:28:17 字數 4310 閱讀 3920

本次和大家分享的是怎麼來消費服務,上篇文章講了使用feign來消費,本篇來使用rest+ribbon消費服務,並且通過輪詢方式來自定義了個簡易消費元件,本文分享的宗旨是:自定義消費服務的思路;思路如果有可取之處還請「贊」一下:

做為服務消費方準確的來說進行了兩種主流程區分1)獲取可以服務2)呼叫服務,那麼又是如何獲取服務的並且又是通過什麼來呼叫服務的,下面我們來看一副手工圖:

手工圖上能夠看出消費方先獲取了服務方的真實介面位址,然後再通過位址去呼叫介面;然後對於微服務架構來說獲取某乙個類ip或埠然後去呼叫介面肯定是不可取的,因此微服務中產生了一種serviceid的概念;簡單流程介紹完了,下面通過例項來分析;首先新增依賴如:

1

2org.springframework.boot

3spring-boot-starter-web45

6org.springframework.cloud

7spring-cloud-starter-eureka

8

再來我們通過上篇文章搭建的eureka_server(服務中心),eureka_provider(服務提供者)來做測試用例,這裡我重新定義eureka_consumer_ribbon模組做為消費服務;先建立service層類和**:

1

@service

2public

class

userservice implements userinte***ce

1112

@override

13public

string getmsg()

18 }

主要用到了resttemplate的resttemplate.getforobject函式,然後需要定義個controller來吧獲取到的資料響應到頁面上,為了簡單這裡僅僅只拿getmsg服務介面測試:

1

@restcontroller

2public

class

usercontroller

12 }

最後我們在啟動類新增入下**,注意@loadbalanced標記必須加,因為咋們引入的eureka依賴裡面包含了ribbon(dalston.release版本),ribbon封裝了負載均衡的演算法,如果不加這個註解,那後面rest方法的url就必須是可用的url路徑了,當然這裡加了註解就可以使用上面說的serviceid:

1

2 @enablediscoveryclient //

消費客戶端

3public

class45

@bean

6 @loadbalanced //

負載均衡

7resttemplate resttemplate()

1011

public

static

void

main(string args)

14 }

下面來消費方顯示的效果:

4* rest+eureka+自定義client端5*/

6@component

7public

class

shenniubanlance

3536 listservices = new arraylist<>();

37 instanceinfos.foreach(b ->);

4546

//如果存在就更新

4748}49

}5051/**52

53*5455

* @return

56*/

57public

59//

60 listservicemap = sericesmap.get

61if (servicemap == null

) 68}69

70//

篩選出被訪問量最小的service 輪詢的方式

71 moservice moservice =servicemap.stream().min(

72comparator.comparing(moservice::getwatch)

73 ).get

();74

75//

負載記錄+1

76 moservice.setwatch(moservice.getwatch() + 1

);77

return

moservice;78}

7980/**

81* 自動重新整理 服務提供者資訊到map

82*/

83 @scheduled(fixeddelay = 1000 * 10)84

public

void

refreshservicesmap()

8788/**

89* get請求服務獲取返回資料90*

9192

* @param servicename 服務名稱 servicename

93* @param map url上請求引數

94* @param tclass 返回型別

95* @param

96* @return

97*/

98public

t getservicedata(

99100 mapmap,

101 classtclass) catch

(exception ex)

116return

result;

117}

118119/**

120* service資訊

121*/

122public

class

moservice

135136

public

void

setwatch(long watch)

139140

public

string geturl()

143144

public

void

seturl(string url)

147}

148 }

1

@override

2public

string getmsg()

這裡需要注意由於我們在前面resttemplate使用加入了註解@loadbalanced,這樣使得rest請求時必須用非ip的訪問方式(也就是必須serviceid)才能正常響應,不然會提示錯誤如:

簡單來說就是不用再使用ip了,因為有負載均衡機制;當我們去掉這個註解後,我們自定義的元件就能執行成功,效果圖和例項1一樣就不貼圖了;

在微服務架構中,如果某台服務掛了之後,必須要及時更新client端的服務快取資訊,不然就可能請求到down的url去,基於這種考慮我這裡採用了enablesched標記來做定時重新整理;首先在啟動類增加 @enablescheduling ,然後定義乙個刷行服務資訊的服務如:

1/**

2* 自動重新整理 服務提供者資訊到map 3*/

4 @scheduled(fixeddelay = 1000 * 10)5

public

void

refreshservicesmap()

為了方便看測試效果,我們在server,provider(2個),consumer已經啟動的情況下,再啟動乙個埠為2005的provider服務;然後重新整理consumer介面看下效果:

這個時候能夠看到呼叫2005埠的介面成功了,通過@scheduled定時服務吧最新或者失效的服務加入|移除掉,就達到了咋們的需求了;如果你覺得該篇內容對你有幫助,不防贊一下,謝謝。

nuget發布包:

Spring Cloud自定義引導屬性源

引導過程新增的外部配置的預設屬性源是config server,但您可以通過將propertysourcelocator型別的bean新增到引導上下文 通過spring.factories 新增其他源。您可以使用此方法從其他伺服器或資料庫中插入其他屬性。作為乙個例子,請考慮以下微不足道的自定義定位器...

自定義view之自定義屬性

1.首先在res的values檔案下新建乙個名為attrs.xml檔案 在該xml檔案中編寫我們需要的屬性 declare styleable後面的name必須要與接下來要自定義的view名一致。attr 後面的name表示需要自定義的屬性,format表示這些屬性的型別 2.新建乙個類繼承text...

Android自定義控制項之自定義View 二

效果如下圖 1 自定義ringview繼承view新增其構造方法並建立畫筆 public class ringview extends view protected boolean isrunning false public ringview context context public ring...