小白學SpringCloud(二):服務間的調用

feign&Rest_logo

SpringCloud服務間的調用有兩種方式:RestTemplate和FeignClient。不管是什麼方式,他都是通過REST接口調用服務的http接口,參數和結果默認都是通過jackson序列化和反序列化。

一、Ribbon簡介

在說這兩種方式之前,我們先來簡單的看一下Ribbon。

Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using @FeignClient then this section also applies.

這是官網對Ribbon的簡介,簡單的說Ribbon是一個負載均衡客戶端,SpringCloud的兩種服務間調用方式背後都用了Ribbon。

二、使用RestTemplate進行服務調用

代碼Demo接上篇SpringCloud(一):服務的註冊與發現(Eureka)
1.我們首先啓動端口爲8761的eureka工程,把SpringCloud的服務註冊中心啓動。

2.打開我們的Discovery工程。這時候Discovery工程相當於服務端,我們來爲它寫一個提供服務的方法:

@RestController
public class HelloController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/hello")
    public String hello() {
        return "hello! 我是" + port;
    }
}

然後將配置文件中的端口改爲8762和8763分別啓動。
如果你使用的是IDEA的話,只需要去掉下圖中紅框框住的部分就可以將同一工程啓動多個實例
Rest_1
這時,我們就擁有了端口爲8762和8763的兩個Discovery集羣,Eureka中可以看到
feign&Rest_2
3.我們再新建一個Eureka-Discovery工程(可以參照上一篇文章),首先爲他配置好Eureka-Client的配置。在配置文件中爲它指定端口爲8764:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/ #服務端地址
server:
  port: 8764 #客戶端端口
spring:
  application:
    name: client #客戶端名稱

然後我們爲它添加一個RestTemplate的配置Bean,可以參照如下代碼

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

之後我們就可以在需要調用的地方用如下方式進行調用

@RestController
public class ClientController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/cliHello")
    public String CliHello() {
        //第一個參數爲:服務端的應用名稱/調用接口的Mapping
        //第二個參數爲返回的類型
        return restTemplate.getForObject("http://discovery/hello",String.class);
    }

}

結果如圖:
feign&Rest_3
這裏因爲Ribbon的默認負載均衡方式爲輪詢,所以我們可以看到端口8762和8763依次出現。如果有想改變負載均衡方式的小夥伴可以下去自行研究一下,這裏就不過多贅述了。

三、使用Feign進行服務調用

1.添加Feign的pom引用
在FeignClient的pom文件中添加

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

需要注意的是版本一定要跟我的一致,否則添加的依賴有可能會不一樣
2.爲啓動類添加註解
這一步很簡單,只需要在在啓動類上添加@EnableFeignClients註解:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
}

3.定義一個Feign接口
代碼如下:

//name是服務端的名稱
@FeignClient(name = "discovery")
public interface HelloClient {

    //url是調用服務的url值
    @GetMapping("/hello")
    String hello();
}

4.調用
在配置了Feign接口後,我們就可以直接進行注入調用了

    @Autowired
    private HelloClient helloClient;

    @GetMapping("/feignHello")
    public String feignHello() {
        return helloClient.hello();
    }

調用的結果跟RestTemplate也相同
feign&Rest_3_1
從這裏我們可以看到,使用Feign是僞分佈式的調用方式。


本文作者: catalinaLi
本文鏈接: http://catalinali.top/2018/startfeign&Rest/
版權聲明: 原創文章,有問題請評論中留言。非商業轉載請註明作者及出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章