玩轉SpringCloud(F版本) 二.服務消費者(1)ribbon+restTemplate

上一篇博客有人問我,Springcloud系列會不會連載 ,你們能夠看到個人標籤分類裏已經開設了SpringCloud專題,因此固然會連載啦,本人最近也是買了本書在學習SpringCloud微服務框架,知識會隨時分享的!!!!!!!!!!!!!!!!!!!!!

二.服務消費者

 

在微服務架構中,業務都會被拆分紅一個獨立的服務,服務與服務的通信是基於http restful的。Spring cloud有兩種服務調用方式,一種是ribbon+restTemplate,另外一種是feignhtml

本片博客以上一篇博客 玩轉SpringCloud 一.服務的註冊與發現(Eureka) 的項目爲基礎   https://www.cnblogs.com/lsy131479/p/9613755.html  web

本片博客將講解ribbon+restTemplate模式,下一篇講解feign模式spring

 

1. ribbon+restTemplate

 

ribbon是一個負載均衡客戶端,能夠很好的控制htt和tcp的一些行爲瀏覽器

啓動demo1 工程;啓動demo2工程,它的端口爲8762;將demo2的配置文件的端口改成8763,並啓動,會發現:demo2demo1 註冊了2個實例,這就至關於一個小的集羣restful

 

啓動以前先將demo2的啓動設置單例關掉架構

 

項目啓動後而且關掉單例啓動後,改變demo2的端口號app

再次啓動demo2,查看註冊中心的服務http://localhost:8761負載均衡

 

 會發現:demo2在demo1 註冊了2個實例,這就至關於一個小的集羣。框架

 

建一個服務消費者

項目架構:tcp

 

 

從新新建一個spring-boot工程,取名爲:demo3;

 

引入主項目,以及相關jar包:

 

<parent>
   <groupId>com.fsdm</groupId>
   <artifactId>SpringCloud_test1</artifactId>
   <version>1.0-SNAPSHOT</version>
</parent>

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

 

yml配置:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764
spring:
  application:
  #工程名稱
    name: service-ribbon

 

在工程的啓動類中,經過@EnableDiscoveryClient向服務中心註冊;而且向程序的ioc注入一個bean: restTemplate;並經過@LoadBalanced註解代表這個restRemplate開啓負載均衡的功能。

@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class Demo3Application {

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


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

註解解析:

 

@EnableDiscoveryClient

1. 基於spring-cloud-commons,而且在classpath中實現。

2. 就是若是選用的註冊中心是eureka推薦@EnableEurekaClient,若是是其餘的註冊中心推薦使用@EnableDiscoveryClient,若是classpath中添加了eureka,則它們的做用是同樣的。

 

 

@Bean

一、Java面向對象,對象有方法和屬性,那麼就須要對象實例來調用方法和屬性(即實例化);

二、凡有方法或屬性的類都須要實例化,這樣才能具象化去使用這些方法和屬性;

三、規律:凡是子類及帶有方法或屬性的類都要加上註冊BeanSpring IoC的註解

 

四、Bean理解爲類的代理或代言人(實際上確實是經過反射、代理來實現的),這樣它就能表明類擁有該擁有的東西了

五、咱們都在微博上@過某某,對方會優先看到這條信息,並給你反饋,那麼在Spring中,你標識一個@符號,那麼Spring就會來看看,而且從這裏拿到一個Bean或者給出一個Bean

 

@LoadBalanced

1. 代表這個restRemplate開啓負載均衡的功能。

2. 實現負載均衡

 

 

寫一個測試類HelloService,經過以前注入ioc容器的restTemplate來消費service-hi服務的「/hi」接口,在這裏咱們直接用的程序名替代了具體的url地址,在ribbon中它會根據服務名來選擇具體的服務實例,根據服務實例在請求的時候會用具體的url替換掉服務名.

public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }
}

寫一個controller,在controller中用調用HelloService 的方法

@RestController
public class HelloControler {

    @Autowired
    HelloService helloService;

    @GetMapping(value = "/hi")
    public String hi(@RequestParam String name) {
        return helloService.hiService( name );
    }

}

啓動demo3工程

運行工程狀況:

(demo2雙啓動)

 

在瀏覽器上屢次訪問http://localhost:8764/hi?name=forezp,瀏覽器交替執行顯示

這說明當咱們經過調用restTemplate.getForObject(「http://SERVICE-HI/hi?name=「+name,String.class)方法時,已經作了負載均衡,訪問了不一樣的端口的服務實例。

 

此時的架構:(網摘)

 

  · 一個服務註冊中心,eureka server,端口爲8761

  · service-hi工程跑了兩個實例,端口分別爲8762,8763,分別向服務註冊中心註冊

  · sercvice-ribbon端口爲8764,向服務註冊中心註冊

  · sercvice-ribbon經過restTemplate調用service-hi的hi接口時,由於用ribbon進行了負載均衡,會輪流的調用service-hi:8762和8763 兩個端口的hi接口;

 

 

 

 

                                    未完,待續。。。

相關文章
相關標籤/搜索