上一篇博客有人問我,Springcloud系列會不會連載 ,大家可以看到我的標簽分類里已經開設了SpringCloud專題,所以當然會連載啦,本人最近也是買了本書在學習SpringCloud微服務框架,知識會隨時分享的!!!!!!!!!!!!!!!!!!!!! 二.服務消費者 在微服務架構中,業務都 ...
上一篇博客有人問我,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,並啟動,會發現:demo2在demo1 註冊了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、規律:凡是子類及帶有方法或屬性的類都要加上註冊Bean到Spring 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介面;
未完,待續。。。