在微服務架構中,業務都會被拆分紅一個獨立的服務,服務與服務的通信是基於http restful的。Spring cloud有兩種服務調用方式,一種是ribbon+restTemplate,另外一種是feignhtml
本片博客以上一篇博客 玩轉SpringCloud 一.服務的註冊與發現(Eureka) 的項目爲基礎 https://www.cnblogs.com/lsy131479/p/9613755.html web
本片博客將講解ribbon+restTemplate模式,下一篇講解feign模式spring
ribbon是一個負載均衡客戶端,能夠很好的控制htt和tcp的一些行爲。瀏覽器
啓動demo1 工程;啓動demo2工程,它的端口爲8762;將demo2的配置文件的端口改成8763,並啓動,會發現:demo2在demo1 註冊了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面向對象,對象有方法和屬性,那麼就須要對象實例來調用方法和屬性(即實例化);
二、凡有方法或屬性的類都須要實例化,這樣才能具象化去使用這些方法和屬性;
三、規律:凡是子類及帶有方法或屬性的類都要加上註冊Bean到Spring 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接口;
未完,待續。。。