成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

傳統(tǒng)Http服務(wù)與SpringCloud微服務(wù)的整合

jsummer / 3201人閱讀

摘要:沒有顯式的通常調(diào)用需要指定域名才能定位到某個(gè)服務(wù)器上的某個(gè)具體應(yīng)用,而通過(guò)的注冊(cè)中心,在調(diào)用時(shí)只需指定服務(wù)名稱,注冊(cè)中心會(huì)自動(dòng)發(fā)現(xiàn)對(duì)應(yīng)的具體服務(wù)。

起因

公司要做系統(tǒng)間的互通,所以需要程序之間互相調(diào)用接口,這塊一直是其他同事在做,但是今天一個(gè)新項(xiàng)目需要調(diào)用到其他系統(tǒng)的接口,所以看了下他們的調(diào)用方法,發(fā)現(xiàn)都是傳統(tǒng)的httpclient調(diào)用,外面做了一層封裝,類似這樣:

HttpGet httpGet = new HttpGet(url);
HttpClient client = new DefaultHttpClient();
HttpResponse resp = client.execute(httpGet);
HttpEntity entity = resp.getEntity();
String respContent = EntityUtils.toString(entity, "utf-8").trim();
httpGet.abort();
client.getConnectionManager().shutdown();
return respContent;

然后在調(diào)用的時(shí)候,大概是這樣:

String urls = mapToUrl("");//這里是組合URL的方法
String result = HttpClients.clientDoPost(urls);//這里就是調(diào)用上面封裝的httpclient
JSONObject json = JSONObject.parseObject(result);//解析返回值

這樣有什么弊端呢?在我看來(lái)最大的一點(diǎn)就是,調(diào)用方法沒有語(yǔ)義化。
稍微解釋一下,這種方法調(diào)用寫在controller里面,給其他人員看到,首先會(huì)理解為:

先組合一下URL和參數(shù)

然后發(fā)起一個(gè)http請(qǐng)求

最后解析http的response

貌似看起來(lái)很清晰,其實(shí)不然,對(duì)整個(gè)項(xiàng)目不熟悉的人,完全不知道這三行代碼做了哪些事情,做了具體哪些業(yè)務(wù)操作,只知道我調(diào)用了一次http請(qǐng)求。
所以,我決定對(duì)項(xiàng)目整體的結(jié)構(gòu)進(jìn)行改造,然后才有了今天這篇文章。

整體結(jié)構(gòu)設(shè)計(jì)

公司有很多項(xiàng)目,之前都是外包出去做的,各種語(yǔ)言各種框架的都有,自我入職以來(lái),新的項(xiàng)目我都采用了springboot框架,同時(shí),也讓同事使用了這個(gè)框架。
所以這次改造,我打算接入springcloud,它和springboot無(wú)縫銜接這種天然的優(yōu)勢(shì)必須要好好利用。但是還有一些其他項(xiàng)目沒有用到springboot,考慮到這種接入cloud比較困難,所以繼續(xù)保留了httpclient的調(diào)用方式。然后設(shè)計(jì)出大致的結(jié)構(gòu):

優(yōu)勢(shì)對(duì)比

既然打算要接入,總要說(shuō)下好處,不然不能讓別人信服,我大致列出來(lái)四個(gè)。

接入簡(jiǎn)單

在springboot上接入springcloud并注冊(cè)eureka服務(wù)器,只需要簡(jiǎn)單幾步,加幾個(gè)注解就可以完成。

沒有顯式的IP

通常httpclient調(diào)用需要指定 IP+context||域名+context 才能定位到某個(gè)服務(wù)器上的某個(gè)具體應(yīng)用,而通過(guò)springcloud的eureka注冊(cè)中心,在調(diào)用時(shí)只需指定服務(wù)名稱,注冊(cè)中心會(huì)自動(dòng)發(fā)現(xiàn)對(duì)應(yīng)的具體服務(wù)。

自動(dòng)負(fù)載均衡

普通的http后臺(tái)要做負(fù)載均衡,需要借助Nginx或者Apache這樣的第三方proxy程序,而springcloud的fegin客戶端會(huì)自動(dòng)完成負(fù)載操作,發(fā)現(xiàn)eureka注冊(cè)中心上所有可用的服務(wù)。

強(qiáng)語(yǔ)義化

fegin客戶端調(diào)用http方法只需要和被調(diào)用的方法有一樣的方法聲明,requestParam注解,只需定義一下接口,feginClient注解會(huì)自動(dòng)幫你實(shí)現(xiàn),這樣就可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程接口了。

具體設(shè)計(jì)

之前確定了整體的結(jié)構(gòu),現(xiàn)在就要把實(shí)現(xiàn)具體化,首先要把springcloud的服務(wù)和普通的http服務(wù)聯(lián)系在一起,然后再具體到某個(gè)服務(wù)的調(diào)用。這里畫了一個(gè)大致的圖例。

普通的http服務(wù)還使用httpclient調(diào)用,只是多封裝了一層語(yǔ)義化,這里先不贅述了,下面說(shuō)下springcloud服務(wù)化以及調(diào)用eureka和普通http接口的方法。

注冊(cè)中心

首先要啟動(dòng)注冊(cè)中心,去springcloud的GitHub下載Eureka Sample注冊(cè)中心模板,然后修改配置,放到服務(wù)器上運(yùn)行。

注冊(cè)eureka服務(wù)

首先,要使一個(gè)springboot程序注冊(cè)為eureka服務(wù),要引入maven包(沒有使用maven管理項(xiàng)目的童鞋要自己導(dǎo)包了)


    org.springframework.cloud
    spring-cloud-starter-eureka


    org.springframework.cloud
    spring-cloud-starter-feign

加入dependentsManage管理版本


    
        
            org.springframework.cloud
            spring-cloud-dependencies
            Dalston.SR4
            pom
            import
        
    

然后在controller上加上注解@EnableEurekaClient注解

@EnableEurekaClient
@RestController
public class TestController {

}

然后在springbootApplication啟動(dòng)類上要加上@EnableDiscoveryClient,@EnableFeignClients,使它擁有一個(gè)fegin客戶端的能力。這里就不貼代碼了。
最后要修改springboot的配置文件application.yml,增加eureka服務(wù)器和自身應(yīng)用名稱的配置

eureka:
  client:
    serviceUrl:
      defaultZone: http://ip:port/eureka/
spring:
  application:
    name: your-application-Name

這樣,你的原有的服務(wù)就被改造成springcloud微服務(wù)了。

fegin調(diào)用

fegin調(diào)用很簡(jiǎn)單,只要在接口上加上@FeignClient(value = "應(yīng)用名"),然后定義下調(diào)用的接口聲明,就可以了

//原接口
@RequestMapping(value = "/hi",method = RequestMethod.GET)
public String sayHiFromClientOne(@RequestParam(value = "name") String name){
     return "hello "+name;   
}
//fegin客戶端
@FeignClient(value = "sportsHealth")
public interface TestfeginClient {
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
Http調(diào)用

這里在httpclient基礎(chǔ)上封裝成語(yǔ)義化的調(diào)用。

//繼承fegin接口的方法
public interface TestHttpClient extends TestfeginClient {

}
//實(shí)現(xiàn)類
@Service
public class TestHttpClientImpl implements TestHttpClient {
    @Override
    public ConcretObject sayHiFromClientOne(String name) {
        Map map = new HashMap<>();
        map.put("name",name);
        String urls=MapToUrl("ip"+"context", map);
        String result = HttpClients.clientDoPost(urls);
        ConcretObject ret= JSONObject.parseObject(result, ConcretObject .class);
        return ret;
    }

這樣調(diào)用起來(lái)就和fegin以及本地方法無(wú)二了

//先注入
@Autowired
private TestFeginClient testFeginClient;
@Autowired
private TestHttpClient testHttpClient;
//調(diào)用Fegin
testFeginClient.sayHiFromClientOne("張三");
//調(diào)用Http
testHttpClient.sayHiFromClientOne("李四");
Facade Service

雖然現(xiàn)在以及很簡(jiǎn)單了,但是現(xiàn)在存在一些普通的http接口,以及有些http接口后面要注冊(cè)到eureka服務(wù)但是現(xiàn)在還沒接入的。為了盡量統(tǒng)一化調(diào)用,不在業(yè)務(wù)層里httpclient,feginclient混亂調(diào)用,我們建立一層facade層,統(tǒng)一化調(diào)用,先調(diào)用fegin客戶端,失敗后嘗試http調(diào)用(ps:這會(huì)產(chǎn)生一些性能開銷,對(duì)實(shí)時(shí)性要求很強(qiáng)的公司最好就別這樣做了,這里是因?yàn)槲覀兊膶?shí)時(shí)性并不強(qiáng),可以接受一點(diǎn)延遲,結(jié)合實(shí)際情況使用的)
下面是簡(jiǎn)單的sample:

//先繼承feginclient接口
public interface TestFacade extends TestFeginClient {

}
//實(shí)現(xiàn)facade
@Service
public class TestFacadeImpl implements TestFacade {
    //先注入
    @Autowired
    private TestFeginClient testFeginClient;
    @Autowired
    private TestHttpClient testHttpClient;
    
    //實(shí)現(xiàn)接口方法
    @Override
    public ConcretObject sayHiFromClientOne(String name) {
         ConcretObject obj;
         try {
             //調(diào)用feginclient
             obj= testFeginClient.sayHiFromClientOne(name);
            }catch (Exception e){
                try {
                    //調(diào)用httpclient
                    obj= testHttpClient.sayHiFromClientOne(name);
                }catch (Exception e1){
                    //都調(diào)用失敗處理
                    obj= new ConcretObject ();
                    obj.setCode("1");
                    obj.setMessage("調(diào)用失敗");
                }
          }
          return obj;
    }
}
結(jié)束

以上就是我的初衷到設(shè)計(jì)思路到具體的實(shí)現(xiàn),springcloud還有很多強(qiáng)大的成員:斷路器,路由,。。。目前還沒有用上,當(dāng)然,我也在學(xué)習(xí)過(guò)程中,希望能和大家一起交流,最后附上我的GitHub,歡迎給我star。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67898.html

相關(guān)文章

  • 【技術(shù)雜談】springcloud服務(wù)之?dāng)?shù)據(jù)操作獨(dú)立模塊化

    摘要:而在這個(gè)微服務(wù)下,同樣需要進(jìn)行數(shù)據(jù)操作,我不可能還要在下再一次進(jìn)行集成,這樣大大的增加了代碼量。其次,是將有關(guān)數(shù)據(jù)操作的都單獨(dú)部署成一個(gè)模塊,比如我集成的模塊,集成的模塊,使用作為內(nèi)存緩存模塊。 前言 相對(duì)于 spring 對(duì) mybatis 以及 redis 等的整合所需要的各種配置文件,在 springboot 下,已經(jīng)大大的簡(jiǎn)化了,你可能只是需要增加個(gè)依賴,加個(gè)注解,然后在配置文...

    tianyu 評(píng)論0 收藏0
  • 外行人都能看懂SpringCloud,錯(cuò)過(guò)了血虧!

    摘要:集群系統(tǒng)中的單個(gè)計(jì)算機(jī)通常稱為節(jié)點(diǎn),通常通過(guò)局域網(wǎng)連接,但也有其它的可能連接方式。這樣就高興了,可以專心寫自己的,前端就專門交由小周負(fù)責(zé)了。于是,小周和就變成了協(xié)作開發(fā)。都是為了項(xiàng)目正常運(yùn)行以及迭代。 一、前言 只有光頭才能變強(qiáng) 認(rèn)識(shí)我的朋友可能都知道我這陣子去實(shí)習(xí)啦,去的公司說(shuō)是用SpringCloud(但我覺得使用的力度并不大啊~~)... 所以,這篇主要來(lái)講講SpringClou...

    沈建明 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<