解決方案:Labwindows\CVI通過(guò)調用DLL文件與非NI采集卡通信
優(yōu)采云 發(fā)布時(shí)間: 2022-12-22 07:52解決方案:Labwindows\CVI通過(guò)調用DLL文件與非NI采集卡通信
菜鳥(niǎo)學(xué)習筆記:Java基礎1(走進(jìn)Java,數據類(lèi)型與轉換)
菜鳥(niǎo)學(xué)習筆記:Java基礎1(基礎語(yǔ)法、面向對象) 寫(xiě)在前面 關(guān)于學(xué)習資源 關(guān)于學(xué)習方法 1.Java的發(fā)展歷史 功能快捷鍵 標題的合理創(chuàng )建有助于目錄的生成 如何改變樣式文本插入 鏈接和圖片 如何插入一段漂亮的代碼 生成適合你的列表 創(chuàng )建表格 設置內容居中、左、右 SmartyPants 創(chuàng )建自定義列表 如何創(chuàng )建腳注 注釋也是必不可少的 KaTeX 數學(xué)公式New Gan 特別圖功能,豐富你的文章UML圖表 FLowchart 流程圖 導出導入 導出導入 第一次發(fā)博我寫(xiě)在前面了,還是有點(diǎn)緊張,哈哈,先自我介紹一下,我只是畢業(yè)于小白
Spring Cloud開(kāi)放Feign系列【4】集成OkHttp與連接池配置詳解
文章目錄 Feign 如何發(fā)送請求 Client 接口 默認類(lèi) Proxied 類(lèi) Feign 支持其他 HTTP 客戶(hù)端框架 支持項 HTTP 連接池 Feign 集成 Ok Http1. 添加 okhttp 依賴(lài)2。 添加配置3。 連接池配置 4. 簡(jiǎn)單測試Feign如何發(fā)送Request 在前面的文檔中可以了解到Feign集成了其他HTTP客戶(hù)端框架來(lái)發(fā)送請求。 實(shí)際的發(fā)送請求是由Feign中的Client接口實(shí)現類(lèi)處理的。 默認是 Defalut 類(lèi),它使用 HttpURLConnection。
2.java版商城商戶(hù)平臺搭建 Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商戶(hù)入駐商城直播帶貨商城電商_企業(yè)軟件定制博客-程序員寶貝
一個(gè)好的SpringCloud+SpringBoot b2b2c電商平臺涉及到哪些技術(shù)和運營(yíng)方案? 以下是我根據公司產(chǎn)品的總結,希望對大家有所幫助! 1、涉及平臺平臺管理、商戶(hù)端(PC端、移動(dòng)端)、買(mǎi)家平臺(H5/公眾號、小程序、APP端(IOS/Android))、微服務(wù)平臺(業(yè)務(wù)服務(wù)) 2、核心架構Spring Cloud、Spring Boot ,Mybatis,Redis3.前端框架VUE,Uniapp,Bootstrap/H5/CSS3,IOS,Android,小程序
VUE中一個(gè)頁(yè)面調用另一個(gè)頁(yè)面的方法并修改data數據(還記得你曾經(jīng)入過(guò)的坑嗎)_denglei12315的博客-程序員寶寶
頁(yè)面 <template> <div> <el-form ref="form" :model="params" label-width="80px"> <el-row> <el-...
5-38 序列求和-增強版(20分)
給定一個(gè)數AA(1\le A\le 91≤A≤9)和一個(gè)非負整數NN(0\le N\le 1000000≤N≤100000),求序列S = A + AA的和+ AAA + \ cdots + AA\cdots AS=A+AA+AAA+?+AA?A (NN AAs)。 例如當A=1A=1,N=3N=3,S=1+11+111=123S=1+11+111=123.輸入框
【長(cháng)nèng-Logstash】入門(mén)(二)——使用Logstash解析Apache Web日志(使用Filebeat采集數據)
文章目錄 1.簡(jiǎn)介 2.實(shí)現 2.1 下載安裝 2.2 配置輸入filebeat2.3 配置logstash2.3 使用Grok過(guò)濾插件解析web日志編輯 2.4 使用Geoip過(guò)濾插件增強數據編輯 2.5 輸出到es源碼地址 項目推薦 本系列博客是Logstash的學(xué)習應用,部分示例來(lái)自官方文檔。 參考:官方文檔 使用Logstash解析日志 1.介紹示例來(lái)自官網(wǎng)。 在本節中,您將創(chuàng )建一個(gè)...
云優(yōu)采集接口 解決方案:實(shí)踐GoF的設計模式:代理模式
簡(jiǎn)介:代理模式為對象提供了一個(gè)代理來(lái)控制對該對象的訪(fǎng)問(wèn)。
本文分享自華為云社區《【Go實(shí)現】練GoF的23種設計模式:代理模式》,作者:袁君子。
介紹
GoF 定義 Proxy Pattern 如下:
為另一個(gè)對象提供代理或占位符以控制對它的訪(fǎng)問(wèn)。
也就是說(shuō),代理模式為對象提供了一個(gè)代理來(lái)控制對該對象的訪(fǎng)問(wèn)。
是一種使用率非常高的設計模式,在現實(shí)生活中也很常見(jiàn)。 例如,演唱會(huì )票黃牛。 假設你需要看一場(chǎng)演唱會(huì ),但是官網(wǎng)上的票已經(jīng)賣(mài)完了,你當天就去現場(chǎng),通過(guò)黃牛高價(jià)買(mǎi)了一張。 在這個(gè)例子中,黃牛相當于演唱會(huì )門(mén)票的代理人。 當無(wú)法通過(guò)官方渠道購買(mǎi)到門(mén)票時(shí),您已經(jīng)通過(guò)代理完成了目標。
從演唱會(huì )門(mén)票的例子我們也可以看出,使用代理模式的關(guān)鍵是在客戶(hù)端不方便直接訪(fǎng)問(wèn)某個(gè)對象的時(shí)候,提供一個(gè)代理對象來(lái)控制對象的訪(fǎng)問(wèn)。 客戶(hù)端實(shí)際訪(fǎng)問(wèn)的是代理對象,代理對象會(huì )將客戶(hù)端的請求傳遞給本體對象進(jìn)行處理。
UML結構
場(chǎng)景語(yǔ)境
在一個(gè)簡(jiǎn)單的分布式應用系統(示例代碼項目)中,db模塊用于存儲服務(wù)注冊和監控信息,是一個(gè)key-value數據庫。 為了提高訪(fǎng)問(wèn)數據庫的性能,我們決定為其添加一層新的緩存:
另外,我們希望客戶(hù)端在使用數據庫時(shí)不會(huì )察覺(jué)到緩存的存在。 代理模式可以做到這一點(diǎn)。
代碼
// demo/db/cache.go
package db
// 關(guān)鍵點(diǎn)1: 定義代理對象,實(shí)現被代理對象的接口
type CacheProxy struct {
// 關(guān)鍵點(diǎn)2: 組合被代理對象,這里應該是抽象接口,提升可擴展性
db Db
cache sync.Map // key為tableName,value為sync.Map[key: primaryId, value: interface{}]
hit int
miss int
}
// 關(guān)鍵點(diǎn)3: 在具體接口實(shí)現上,嵌入代理本身的邏輯
func (c *CacheProxy) Query(tableName string, primaryKey interface{}, result interface{}) error {
cache, ok := c.cache.Load(tableName)
if ok {
if record, ok := cache.(*sync.Map).Load(primaryKey); ok {
c.hit++
result = record
return nil
}
}
c.miss++
if err := c.db.Query(tableName, primaryKey, result); err != nil {
return err
}
cache.(*sync.Map).Store(primaryKey, result)
return nil
}
func (c *CacheProxy) Insert(tableName string, primaryKey interface{}, record interface{}) error {
if err := c.db.Insert(tableName, primaryKey, record); err != nil {
return err
}
cache, ok := c.cache.Load(tableName)
if !ok {
return nil
}
cache.(*sync.Map).Store(primaryKey, record)
return nil
<p>
}
...
// 關(guān)鍵點(diǎn)4: 代理也可以有自己特有方法,提供一些輔助的功能
func (c *CacheProxy) Hit() int {
return c.hit
}
func (c *CacheProxy) Miss() int {
return c.miss
}
...</p>
客戶(hù)端像這樣使用它:
// 客戶(hù)端只看到抽象的Db接口
func client(db Db) {
table := NewTable("region").
WithType(reflect.TypeOf(new(testRegion))).
WithTableIteratorFactory(NewRandomTableIteratorFactory())
db.CreateTable(table)
table.Insert(1, &testRegion{Id: 1, Name: "region"})
result := new(testRegion)
db.Query("region", 1, result)
}
func main() {
// 關(guān)鍵點(diǎn)5: 在初始化階段,完成緩存的實(shí)例化,并依賴(lài)注入到客戶(hù)端
cache := NewCacheProxy(&memoryDb{tables: sync.Map{}})
client(cache)
}
本例中,Subject是Db接口,Proxy是CacheProxy對象,SubjectImpl是memoryDb對象:
總結一下實(shí)現代理模式的幾個(gè)關(guān)鍵點(diǎn):
定義代理對象,實(shí)現代理對象的接口。 在這個(gè)例子中,前者是CacheProxy對象,后者是Db接口。 代理對象組合代理對象。 這里應該結合抽象接口,使代理更具可擴展性。 在這個(gè)例子中,CacheProxy 對象結合了 Db 接口。 代理對象在具體接口的實(shí)現中嵌入了代理本身的邏輯。 本例中CacheProxy在Query、Insert等方法中加入了cache sync.Map的讀寫(xiě)邏輯。 代理對象也可以有自己獨特的方法來(lái)提供一些輔助功能。 本例中CacheProxy增加了Hit、Miss等方法來(lái)統計緩存的命中率。 最后,在初始化階段,代理被實(shí)例化并注入到客戶(hù)端中。 這就要求客戶(hù)端依賴(lài)抽象接口而不是具體實(shí)現,否則代理是不透明的。在Go標準庫中擴展反向代理
代理模式最典型的應用場(chǎng)景就是遠程代理,其中反向代理是最常用的一種。
以Web應用為例,反向代理位于Web服務(wù)器的前端,將客戶(hù)端(如Web瀏覽器)的請求轉發(fā)給后端Web服務(wù)器。 反向代理通常用于幫助提高安全性、性能和可靠性,例如負載平衡、SSL 安全連接。
Go標準庫的net包也提供了一個(gè)反向代理ReverseProxy,位于net/http/httputil/reverseproxy.go下,它實(shí)現了http.Handler接口。 http.Handler提供了處理Http請求的能力,相當于一個(gè)Http服務(wù)器。 那么,對應UML*敏*感*詞*,http.Handler是Subject,ReverseProxy是Proxy:
ReverseProxy的部分核心代碼如下:
// net/http/httputil/reverseproxy.go
package httputil
type ReverseProxy struct {
// 修改前端請求,然后通過(guò)Transport將修改后的請求轉發(fā)給后端
Director func(*http.Request)
// 可理解為Subject,通過(guò)Transport來(lái)調用被代理對象的ServeHTTP方法處理請求
Transport http.RoundTripper
// 修改后端響應,并將修改后的響應返回給前端
ModifyResponse func(*http.Response) error
// 錯誤處理
ErrorHandler func(http.ResponseWriter, *http.Request, error)
...
}
func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
// 初始化transport
transport := p.Transport
<p>
if transport == nil {
transport = http.DefaultTransport
}
...
// 修改前端請求
p.Director(outreq)
...
// 將請求轉發(fā)給后端
res, err := transport.RoundTrip(outreq)
...
// 修改后端響應
if !p.modifyResponse(rw, res, outreq) {
return
}
...
// 給前端返回響應
err = p.copyResponse(rw, res.Body, p.flushInterval(res))
...
}</p>
ReverseProxy是代理模式的典型實(shí)現,遠程代理不能直接引用后端的對象引用,所以這里通過(guò)引入Transport來(lái)遠程訪(fǎng)問(wèn)后端服務(wù),Transport可以理解為一個(gè)Subject。
您可以像這樣使用 ReverseProxy:
func proxy(c *gin.Context) {
remote, err := url.Parse("https://yrunz.com")
if err != nil {
panic(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
proxy.Director = func(req *http.Request) {
req.Header = c.Request.Header
req.Host = remote.Host
req.URL.Scheme = remote.Scheme
req.URL.Host = remote.Host
req.URL.Path = c.Param("proxyPath")
}
proxy.ServeHTTP(c.Writer, c.Request)
}
func main() {
r := gin.Default()
r.Any("/*proxyPath", proxy)
r.Run(":8080")
}
典型應用場(chǎng)景優(yōu)缺點(diǎn)優(yōu)缺點(diǎn)與其他模式的關(guān)聯(lián)
從結構上看,裝飾模式和代理模式相似度很高,但兩者的側重點(diǎn)不同。 前者強調為本體對象增加新的功能,后者強調對本體對象的訪(fǎng)問(wèn)控制。
帶圖片的文章
文章的繪制方法可以在Keynote手繪風(fēng)格繪圖中找到。
參考
[1]【Go實(shí)現】實(shí)踐GoF的23種設計模式:SOLID原則,元君子
[2]【Go實(shí)現】實(shí)踐GoF的23種設計模式:裝飾模式,元君子
[3] 設計模式,第 4 章結構模式,GoF
[4]代理模式,
[5] 什么是反向代理? , 云耀斑
點(diǎn)擊關(guān)注,第一時(shí)間了解華為云的新鮮技術(shù)~