微服務(wù)調(diào)用方式

微服務(wù)調(diào)用方式之Ribbon

Ribbon簡(jiǎn)介

Ribbon是Netflix發(fā)布的云中間層服務(wù)開源項(xiàng)目,其主要功能是提供客戶端實(shí)現(xiàn)負(fù)載均衡算法。Ribbon客戶端組件提供一系列完善的配置項(xiàng)如連接超時(shí),重試等葵袭。簡(jiǎn)單的說(shuō)沉颂,Ribbon是一個(gè)客戶端負(fù)載均衡器,我們可以在配置文件中Load Balancer后面的所有機(jī)器独泞,Ribbon會(huì)自動(dòng)的幫助你基于某種規(guī)則(如簡(jiǎn)單輪詢,隨機(jī)連接等)去連接這些機(jī)器苔埋,我們也很容易使用Ribbon實(shí)現(xiàn)自定義的負(fù)載均衡算法懦砂。

Ribbon的使用

通過(guò)IDEA創(chuàng)建項(xiàng)目并引入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yuan</groupId>
    <artifactId>order_service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>order_service</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

向注冊(cè)中心注冊(cè)服務(wù)(application.yml)

server:
  port: 8781

#指定注冊(cè)中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

#服務(wù)的名稱
spring:
  application:
    name: order-service

使用Ribbon
啟動(dòng)類中加入如下代碼:

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

使用添加@LoadBalanced注解后的RestTemplate調(diào)用服務(wù)提供者的接口時(shí),可以使用虛擬IP替代真實(shí)IP地址组橄。所謂的虛擬IP就是服務(wù)提供者在application.yml文件中配置的spring.application.name屬性的值荞膘。示例如下:(調(diào)用上篇文章中的)

@RestController
@RequestMapping("api/v1/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

   //調(diào)用方式二
   @Autowired
   private LoadBalancerClient loadBalancer;

    @RequestMapping("save")
    public Object save(@RequestParam("user_id") int userId,@RequestParam("product_id") int productId){
        Object obj=restTemplate.getForObject("http://product-service/api/v1/product/findById?id="+productId,Object.class);

         //調(diào)用方式二
        //ServiceInstance instance = loadBalancer.choose("product-service");
         //String url = String.format("http://%s:%s/api/v1/product/find?id="+productId, instance.getHost(),instance.getPort());
        // RestTemplate restTemplate = new RestTemplate();
        // Map<String,Object> productMap = restTemplate.getForObject(url, Map.class);

       return obj;

    }
}

啟動(dòng)注冊(cè)中心 服務(wù)提供者和消費(fèi)者

調(diào)用url進(jìn)行測(cè)試

可以發(fā)現(xiàn)有負(fù)載均衡 默認(rèn)調(diào)用為輪詢 每個(gè)端口被輪著調(diào)用

修改負(fù)載均衡策略(IRule實(shí)現(xiàn)類全路徑)
文檔:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_customizing_the_ribbon_client_by_setting_properties

#自定義負(fù)載均衡策略
product-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

如果部分機(jī)器配置強(qiáng),則可以改為 WeightedResponseTimeRule

微服務(wù)調(diào)用方式之feign

Ribbon簡(jiǎn)介

Feign是Netflix開發(fā)的聲明式玉工、模塊化的HTTP客戶端羽资,其靈感來(lái)自Retrofit、JAXRS-2.0以及WebSocket遵班。Feign可幫組我們更加便捷屠升、優(yōu)雅的調(diào)用HTTP API潮改。
在Spring Cloud中,使用Feign非常簡(jiǎn)單——?jiǎng)?chuàng)建一個(gè)接口腹暖,并在接口上添加一些注解汇在,代碼就完成了。Feign支持多種注解脏答,例如Feign自帶的注解或者JAX-RS注解等糕殉。

配置Feign

引入依賴:

 <dependency>
     <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>

啟動(dòng)類增加注解@EnableFeignClients

@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

yml配置:

server:
  port: 8781

#指定注冊(cè)中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

#服務(wù)的名稱
spring:
  application:
    name: order-service

#修改調(diào)用超時(shí)時(shí)間
feign:
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 2000
Feign的使用
@FeignClient(name = "product-service")
public interface ProductClient {
    @GetMapping("/api/v1/product/find")
    String findById(@RequestParam(value = "id") int id);
}

上面是最簡(jiǎn)單的feign client的使用,聲明完為feign client后殖告,其他spring管理的類阿蝶,如service就可以直接注入使用了,例如:

    @Autowired
    private ProductClient productClient;

    @Override
    public ProductOrder save(int userId, int productId) {
        String response = productClient.findById(productId);
        JsonNode  jsonNode = JsonUtils.str2JsonNode(response);

        ProductOrder productOrder = new ProductOrder();
        productOrder.setCreateTime(new Date());
        productOrder.setUserId(userId);
        productOrder.setTradeNo(UUID.randomUUID().toString());
        productOrder.setProductName(jsonNode.get("name").toString());
        productOrder.setPrice(Integer.parseInt(jsonNode.get("price").toString()));
        return productOrder;
    }

可以看到黄绩,使用feign之后羡洁,我們調(diào)用eureka 注冊(cè)的其他服務(wù),在代碼中就像各個(gè)service之間相互調(diào)用那么簡(jiǎn)單爽丹。

Feign Client開啟日志

方式一:通過(guò)java bean的方式指定
@EnableFeignClients注解上有個(gè)defaultConfiguration屬性焚廊,可以指定默認(rèn)Feign Client的一些配置。

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
@SpringBootApplication
public class ProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }
}
@Configuration
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.BASIC;
    }
}

方式二:通過(guò)配置文件指定

logging:
  level:
    com.xt.open.jmall.product.remote.feignclients.CartFeignClient: debug
Feign原理簡(jiǎn)述
  • 啟動(dòng)時(shí)习劫,程序會(huì)進(jìn)行包掃描咆瘟,掃描所有包下所有@FeignClient注解的類,并將這些類注入到spring的IOC容器中诽里。當(dāng)定義的Feign中的接口被調(diào)用時(shí)袒餐,通過(guò)JDK的動(dòng)態(tài)代理來(lái)生成RequestTemplate。
  • RequestTemplate中包含請(qǐng)求的所有信息谤狡,如請(qǐng)求參數(shù)灸眼,請(qǐng)求URL等。
  • RequestTemplate聲場(chǎng)Request墓懂,然后將Request交給client處理焰宣,這個(gè)client默認(rèn)是JDK的HTTPUrlConnection,也可以是OKhttp捕仔、Apache的HTTPClient等匕积。
  • 最后client封裝成LoadBaLanceClient,結(jié)合ribbon負(fù)載均衡地發(fā)起調(diào)用榜跌。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闪唆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钓葫,更是在濱河造成了極大的恐慌悄蕾,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件础浮,死亡現(xiàn)場(chǎng)離奇詭異帆调,居然都是意外死亡奠骄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門番刊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)戚揭,“玉大人,你說(shuō)我怎么就攤上這事撵枢。” “怎么了精居?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵锄禽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我靴姿,道長(zhǎng)沃但,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任佛吓,我火速辦了婚禮宵晚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘维雇。我一直安慰自己淤刃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布吱型。 她就那樣靜靜地躺著逸贾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪津滞。 梳的紋絲不亂的頭發(fā)上铝侵,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音触徐,去河邊找鬼咪鲜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撞鹉,可吹牛的內(nèi)容都是我干的疟丙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼鸟雏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隆敢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起崔慧,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拂蝎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惶室,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温自,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玄货,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悼泌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片松捉。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖馆里,靈堂內(nèi)的尸體忽然破棺而出隘世,到底是詐尸還是另有隱情,我是刑警寧澤鸠踪,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布丙者,位于F島的核電站,受9級(jí)特大地震影響营密,放射性物質(zhì)發(fā)生泄漏械媒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一评汰、第九天 我趴在偏房一處隱蔽的房頂上張望纷捞。 院中可真熱鬧,春花似錦被去、人聲如沸主儡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缀辩。三九已至,卻和暖如春踪央,著一層夾襖步出監(jiān)牢的瞬間臀玄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工畅蹂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留健无,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓液斜,卻偏偏與公主長(zhǎng)得像累贤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子少漆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 微服務(wù)架構(gòu)模式的核心在于如何識(shí)別服務(wù)的邊界臼膏,設(shè)計(jì)出合理的微服務(wù)。但如果要將微服務(wù)架構(gòu)運(yùn)用到生產(chǎn)項(xiàng)目上示损,并且能夠發(fā)揮...
    java菜閱讀 2,940評(píng)論 0 6
  • 微服務(wù)架構(gòu)模式的核心在于如何識(shí)別服務(wù)的邊界渗磅,設(shè)計(jì)出合理的微服務(wù)。但如果要將微服務(wù)架構(gòu)運(yùn)用到生產(chǎn)項(xiàng)目上,并且能夠發(fā)揮...
    程序員技術(shù)圈閱讀 2,776評(píng)論 10 27
  • ?通過(guò)前面兩章對(duì)Spring Cloud Ribbon和Spring Cloud Hystrix的介紹始鱼,我們已經(jīng)掌...
    Chandler_玨瑜閱讀 212,778評(píng)論 15 140
  • 1 為什么需要服務(wù)發(fā)現(xiàn) 簡(jiǎn)單來(lái)說(shuō)仔掸,服務(wù)化的核心就是將傳統(tǒng)的一站式應(yīng)用根據(jù)業(yè)務(wù)拆分成一個(gè)一個(gè)的服務(wù),而微服務(wù)在這個(gè)基...
    謙小易閱讀 25,076評(píng)論 4 93
  • 理想的環(huán)境 光有基礎(chǔ)能力医清,享受自由僅僅具備了理論上的可能性起暮。一個(gè)理想的環(huán)境,是享受自由的重要保障会烙。 一個(gè)兩歲的小孩...
    李先琪閱讀 155評(píng)論 0 0