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


上一篇博客有人問我,Springcloud系列會不會連載 ,大家可以看到我的標簽分類里已經開設了SpringCloud專題,所以當然會連載啦,本人最近也是買了本書在學習SpringCloud微服務框架,知識會隨時分享的!!!!!!!!!!!!!!!!!!!!!

二.服務消費者

 

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

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

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

 

1. ribbon+restTemplate

 

ribbon是一個負載均衡客戶端,可以很好的控制htt和tcp的一些行為

啟動demo1 工程;啟動demo2工程,它的端口為8762;將demo2的配置文件的端口改為8763,並啟動,會發現:demo2demo1 注冊了2個實例,這就相當於一個小的集群

 

啟動之前先將demo2的啟動設置單例關掉

 

項目啟動后並且關掉單例啟動后,改變demo2的端口號

再次啟動demo2,查看注冊中心的服務http://localhost:8761

 

 會發現:demo2在demo1 注冊了2個實例,這就相當於一個小的集群。

 

建一個服務消費者

項目架構:

 

 

重新新建一個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

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

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

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

 

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

5、我們都在微博上@過某某,對方會優先看到這條信息,並給你反饋,那么在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接口;

 

 

 

 

                                    未完,待續。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM