当前位置: 首页 > 后端技术 > Java

使用ingresscontroller连接dubbo+k8s网络

时间:2023-04-02 02:10:33 Java

鑳屾櫙鐢变簬鍏徃鍐呴儴鎵€鏈夋湇鍔¢兘杩愯鍦ㄩ樋閲屼簯k8s涓婏紝鎵€浠ubboprovider榛樿涓婃姤缁欐敞鍐屼腑蹇冪殑IP鏄疨odIP锛屼篃灏辨槸璇村湪k8s闆嗙兢澶栫殑缃戠粶鐜鏃犳硶璋冪敤dubbo鏈嶅姟銆傚鏋滄湰鍦板紑鍙戦渶瑕佽闂甼8s涓殑dubboprovider鏈嶅姟锛岄渶瑕佹墜鍔ㄥ皢鏈嶅姟鏆撮湶鍒板缃戙€傛垜浠殑鍋氭硶鏄负姣忎釜provider鏈嶅姟鏆撮湶涓€涓猄LBIP+鑷畾涔夌鍙o紝閫氳繃dubbo鎻愪緵鐨凞UBBO_IP_TO_REGISTRY鍜孌UBBO_PORT_TO_REGISTRY鐜鍙橀噺灏嗗搴旂殑SLBIP+鑷畾涔夌鍙f敞鍐屽埌娉ㄥ唽涓績锛屼粠鑰屽疄鐜版湰鍦扮綉缁滀箣闂寸殑杩炴帴杩樻湁k8s鐨刣ubbo鏈嶅姟锛屼絾鏄繖绉嶆柟寮忕鐞嗚捣鏉ュ緢楹荤儲锛屾瘡涓湇鍔¢兘瑕佽嚜瀹氫箟涓€涓鍙o紝姣忎釜鏈嶅姟鐨勭鍙d笉鑳藉啿绐併€傚綋鏈嶅姟杈冨鏃讹紝绠$悊璧锋潵灏遍潪甯稿洶闅俱€傛墍浠ユ兂鑳戒笉鑳藉疄鐜颁竴涓竷灞備唬鐞?铏氭嫙鍩熷悕锛屽儚nginxingress涓€鏍峰鐢ㄤ竴涓鍙o紝閫氳繃鐩爣dubboprovider鐨刟pplication.name鍋氱浉搴旂殑杞彂锛岃繖鏍锋墍鏈夌殑鏈嶅姟鍙渶瑕佹敞鍐屽悓涓€涓猄LBIP+绔彛灏卞浜嗭紝澶уぇ鎻愰珮浜嗕究鍒╂€с€備竴鏂圭爺绌跺彂鐜板彲琛屽悗锛屽氨浼氭帹鍑猴紒椤圭洰宸茬粡寮€婧愶細https://github.com/monkeyWie/dubbo-ingress-controller鎶€鏈鐮旀€濊矾棣栧厛dubboRPC璋冪敤榛樿浣跨敤dubbo鍗忚锛屾墍浠ラ渶瑕佺湅鐪嬫湁娌℃湁浠讳綍鍙互鐢ㄤ簬杞彂鐨勫崗璁秷鎭俊鎭兘鏄鎵剧被浼间簬HTTP鍗忚鐨凥ost璇锋眰澶淬€傚鏋滄湁锛屽彲浠ユ牴鎹繖浜涗俊鎭仛鍙嶅悜浠g悊鍜岃櫄鎷熷煙鍚嶈浆鍙戯紝鍦ㄦ鍩虹涓婂彲浠ュ疄鐜扮被浼糿ginx鐨刣ubbo缃戝叧銆傜浜屾锛屽疄鐜癲ubboingresscontroller锛岄€氳繃k8singresswatcher鏈哄埗鍔ㄦ€佹洿鏂癲ubbogateway鐨勮櫄鎷熷煙鍚嶈浆鍙戦厤缃紝鐒跺悗鎵€鏈塸rovider鏈嶅姟閮界敱杩欎釜鏈嶅姟杞彂锛屼笂鎶ョ粰娉ㄥ唽涓績鐨勫湴鍧€涓轰篃缁熶竴涓鸿繖涓湇鍔$殑鍦板潃銆傛灦鏋勫浘dubbo鍗忚鍏堟潵涓€寮犲畼鏂圭殑鍗忚鍥撅細鍙互鐪嬪埌dubbo鍗忚鐨刪eader鏄浐瀹氱殑16瀛楄妭锛屽苟娌℃湁绫讳技HTTPHeader鐨勫彲鎵╁睍瀛楁锛屼篃娌℃湁鎼哄甫application.nametargetprovider鐨勫瓧娈碉紝鎵€浠ユ垜鍚戝畼鏂规彁鍑轰簡涓€涓棶棰樸€傚畼鏂圭殑鍥炵瓟鏄€氳繃consumer-definedFilter鎶婄洰鏍噋rovider鐨刟pplication.name鏀惧湪闄勪欢涓€傝繖閲屼笉寰椾笉鍚愭Ы涓€涓媎ubbo鍗忚銆傛墿灞曞瓧娈靛疄闄呬笂鏀惧湪姝f枃涓紝濡傛灉瑕佸疄鐜拌浆鍙戯紝闇€瑕佽В鏋愭墍鏈夌殑璇锋眰鎶ユ枃锛屾墠鑳藉緱鍒版兂瑕佺殑鎶ユ枃锛屼笉杩囬棶棰樹笉澶э紝鍥犱负涓昏鐢ㄤ簬寮€鍙戠幆澧冿紝杩欎竴姝ュ媺寮哄彲浠ュ疄鐜般€俴8singressk8singress鏄负HTTP鑰岀敓鐨勶紝涓嶈繃閲岄潰鐨勫瓧娈靛凡缁忚冻澶熶簡锛屾垜浠潵鐪嬩竴涓猧ngress閰嶇疆锛歛piVersion:extensions/v1beta1kind:Ingressmetadata:name:user-rpc-dubboannotations:kubernetes.io/ingress.class:"dubbo"spec:rules:-host:user-rpchttp:paths:-backend:serviceName:user-rpcservicePort:20880path:/鍍廻ttp涓€鏍烽€氳繃host閰嶇疆杞彂瑙勫垯锛屼絾鏄痟ost閰嶇疆浜嗙洰鏍囨彁渚涜€卆pplication.name锛屽悗绔湇鍔℃槸鐩爣鎻愪緵鑰呭搴旂殑鏈嶅姟銆傝繖鏄竴涓娇鐢╧ubernetes.io/ingress.class娉ㄨВ鐨勭壒娈婃敞瑙c€傝繖涓敞瑙e彲浠ユ寚瀹氳繖涓猧ngress鍦ㄥ摢涓猧ngresscontroller涓婄敓鏁堛€備箣鍚庯紝鎴戜滑鐨刣ubboingresscontroller鍙細瑙f瀽娉ㄨВ鍊间负dubbo鐨刬ngress閰嶇疆銆傚紑鍙戝墠鐨勬妧鏈鐮旇繘灞曢『鍒╋紝闅忓悗杩涘叆寮€鍙戦樁娈点€傛秷璐硅€呰嚜瀹氫箟Filter鍓嶉潰鎻愬埌锛屽鏋滆姹備腑闇€瑕佹惡甯︾洰鏍囨彁渚涜€呯殑application.name锛岄偅涔堟秷璐硅€呴渶瑕佽嚜瀹氫箟Filter銆備唬鐮佸涓嬶細@Activate(group=CONSUMER)publicclassAddTargetFilterimplementsFilter{@OverridepublicResultinvoke(Invokerinvoker,Invocationinvocation)throwsRpcException{StringtargetApplication=StringUtils.isBlank(invoker.getUrl().鑾峰彇杩滅▼搴旂敤绋嬪簭锛堬級锛夛紵invoker.getUrl().getGroup():invoker.getUrl().getRemoteApplication();//灏嗙洰鏍囨彁渚涜€呯殑application.name鏀惧叆闄勪欢涓璱nvocation.setAttachment("target-application",targetApplication);杩斿洖璋冪敤鑰呫€傝皟鐢紙璋冪敤锛夛紱杩欓噷杩樻湁涓€涓姳鎬紝dubbo娑堣垂鑰呭湪绗竴娆¤闂椂浼氬彂璧蜂竴涓幏鍙栧厓鏁版嵁鐨勮姹傦紝杩欎釜璇锋眰鏃犳硶閫氳繃invoker.getUrl().getRemoteApplication()鑾峰彇鍊硷紝浣嗘槸鍙互閫氳繃invoker.getUrl().getGroup().dubbo缃戝叧杩欓噷闇€瑕佸紑鍙戜竴涓被浼糿ginx鐨刣ubbo缃戝叧锛屽疄鐜颁竷灞備唬鐞嗗拰铏氭嫙鍩熷悕杞彂銆傜紪绋嬭瑷€鐩存帴閫夋嫨go銆傞鍏堬紝go瀵逛簬缃戠粶寮€鍙戠殑绮剧璐熸媴寰堜綆銆傝繕鏈変竴涓猟ubbo-go椤圭洰鍙互鐩存帴浣跨敤銆傞噷闈㈢殑瑙g爜鍣紝鍜実o閮芥湁鍘熺敓鐨刱8ssdk鏀寔锛屽畬缇庯紒鎬濊矾鏄紑鍚竴涓猅CPServer锛岀劧鍚庤В鏋恉ubbo璇锋眰鎶ユ枃锛岃幏鍙栭檮浠朵腑鐨則arget-application灞炴€э紝鐒跺悗鍙嶅悜浠g悊鍒扮湡姝g殑dubboprovider鏈嶅姟銆傛牳蹇冧唬鐮佸涓嬶細routingTable:=map[string]string{"user-rpc":"user-rpc:20880","pay-rpc":"pay-rpc:20880",}listener,err:=net.Listen("tcp",":20880")iferr!=nil{returnerr}for{clientConn,err:=listener.Accept()iferr!=nil{logger.Errorf("鎺ュ彈閿欒:%v",err)continue}gofunc(){deferclientConn.Close()varproxyConnnet.Conndeferfunc(){ifproxyConn!=nil{proxyConn.Close()}}()scanner:=bufio.NewScanner(clientConn)scanner.Split(split)//瑙f瀽璇锋眰娑堟伅锛岃幏鍙栦竴涓畬鏁寸殑璇锋眰scanner.Scan(){data:=scanner.Bytes()//閫氳繃dubbo-go鎻愪緵鐨勫簱灏哰]byte鍙嶅簭鍒楀寲涓篸ubbo璇锋眰缁撴瀯buf:=bytes.NewBuffer(data)pkg:=impl.NewDubboPackage(buf)pkg.Unmarshal()鍖卍y:=pkg.Body.(map[string]interface{})attachments:=body["attachments"].(map[string]interface{})//浠庨檮浠朵腑鑾峰彇鐩爣鎻愪緵鑰呯殑application.name鐩爣锛?attachments["target-application"].(string)ifproxyConn==nil{//鍙嶅悜浠g悊鍒扮湡姝g殑鍚庣鏈嶅姟host:=routingTable[target]proxyConn,_=net.Dial("tcp",host)gofunc(){//鍘熷杞彂io.Copy(clientConn,proxyConn)}()}//灏嗗師濮嬫秷鎭啓鍏ョ湡瀹炲悗绔湇鍔★紝鐒跺悗鍐嶅幓鍘熷杞彂proxyConn.Write(data)}}()}funcsplit(data[]byte,atEOFbool)(advanceint,token[]byte,errerror){濡傛灉atEOF&&len(data)==0{return0,nil,nil}buf:=bytes.NewBuffer(data)pkg:=impl.NewDubboPackage(buf)err=pkg.ReadHeader()iferr!=nil{iferrors.Is(err,hessian.ErrHeaderNotEnough)||}errors.Is(err,hessian.ErrBodyNotEnough){杩斿洖0,nil,nil}return0,nil,err}if!pkg.IsRequest(){return0,nil,errors.New("notrequest")}requestLen:=impl.HEADER_LENGTH+pkg.Header.BodyLen濡傛灉len(data)0{rule:=ingress.Spec.Rules[0]濡傛灉鎴慹n(rule.HTTP.Paths)>0{backend:=rule.HTTP.Paths[0].Backendhost:=rule.Hostservice:=fmt.Sprintf("%s:%d",backend.ServiceName+"."+ingress.Namespace,backend.ServicePort.IntVal)//鑾峰彇ingress閰嶇疆涓環ost瀵瑰簲鐨勬湇鍔★紝閫氱煡dubbo缃戝叧鏇存柊notify(host,service)}}}docker闀滃儚鎻愪緵k8s浠ヤ笂鎵€鏈夋湇鍔°€傚湪瀹瑰櫒涓繍琛岋紝杩欓噷涔熶笉渚嬪锛岄渶瑕佸皢dubboingresscontroller鏋勫缓鎴恉ocker闀滃儚锛岃繖閲岄€氳繃涓ら樁娈垫瀯寤轰紭鍖栵紝鏉ュ噺灏忛暅鍍忕殑澶у皬锛欶ROMgolang:1.17.3ASbuilderWORKDIR/srcCOPY銆?ENVGOPROXYhttps://goproxy.cnENVCGO_ENABLED=0RUNgobuild-ldflags"-w-s"-omaincmd/main.goFROMdebianASrunnerENVTZ=Asia/shanghaiWORKDIR/appCOPY--from=builder/src/main.RUNchmod+x./mainENTRYPOINT["./main"]鎻愪緵yaml妯℃澘璁块棶闆嗙兢涓殑k8sAPI锛岄渶瑕佸Pod杩涜鎺堟潈锛岄€氳繃K8Srbac杩涜鎺堟潈锛岄儴缃蹭负Deployment绫诲瀷鐨勬湇鍔?鏈€缁堟ā鏉垮涓嬶細apiVersion:v1kind:ServiceAccountmetadata:name:dubbo-ingress-controllernamespace:default---kind:ClusterRoleapiVersion:rbac.authorization.k8s.io/v1beta1metadata:name:dubbo-ingress-controllerrules:-apiGroups锛?鎵╁睍璧勬簮锛?鍏ュ彛鍔ㄨ瘝锛?鑾峰彇-鍒楄〃-瑙傚療---绉嶇被锛欳lusterRoleBindingapiVersion锛歳bac.authorization.k8s.io/v1beta1metadata锛氬悕绉帮細dubbo-ingress-controllerroleRef锛歛piGroup锛歳bac.authorization.k8s.io绉嶇被:ClusterRolename:dubbo-ingress-controllersubjects:-kind:ServiceAccountname:dubbo-ingress-controller鍛藉悕绌洪棿:default---apiVersion:apps/v1kind:Deploymentmetadata:namespace:defaultname:dubbo-ingress-controllerlabels:app:dubbo-ingress-controllerspec:selector:matchLabels:app:dubbo-ingress-controllertemplate:metadata:labels:app:dubbo-ingress-controllerspec:serviceAccountName:dubbo-ingress-controllercontainers:-name:dubbo-ingress-controller鍥剧墖锛歭iwei2633/dubbo-ingress-controller:0.0.1ports:-containerPort:20880鍚庢湡闇€瑕佺殑璇濆彲浠ュ仛鎴怘elm杩涜绠$悊鍚庤鑷虫锛宒ubboingresscontroller鐨勫疄鐜板氨瀹屾垚浜嗐€傚彲浠ヨ锛岄夯闆€铏藉皬锛屼簲鑴忎勘鍏ㄣ€傛秹鍙婂埌dubbo鍗忚銆乀CP鍗忚銆佷竷灞備唬鐞嗐€乲8singress銆乨ocker绛夛紝鍏朵腑寰堝鐭ヨ瘑閮芥槸浜戝師鐢熺殑銆傛祦琛屾椂浠i渶瑕佹帉鎻★紝鍙戝睍鍚庢劅瑙夊彈鐩婂尓娴呫€傚畬鏁寸殑浣跨敤鏁欑▼鍙互閫氳繃github鏌ョ湅銆傚弬鑰冮摼鎺ワ細dubbo鍗忚dubbo-go浣跨敤澶氫釜-ingress-controllers锛屼娇鐢℅olang鑷畾涔塊ubernetesIngressController銆傛垜鏄疢onkeyWie锛屾杩庢壂鐮侌煈囸煈囧叧娉紒涓嶅畾鏈熷湪鍏紬鍙峰垎浜獼AVA銆丟olang銆佸墠绔€乨ocker銆乲8s绛夊共璐х煡璇嗐€?/p>