0、項目搭建
創建maven項目,刪除其中的src目錄,作為整體父項目,在其中添加module實現各個組件。
1、Eureka Server的實現
添加module,創建Spring Boot項目,添加Eureka Discovery Client和Eureka Server依賴,作為Eureka Server。
啟動類添加@EnableEurekaServer注釋。
修改配置文件application.yml,如下:
1 server: 2 port: 1001 3 4 eureka: 5 client: 6 //是否將自己注冊到eureka server上,默認為true 7 //由於本節點為eureka server,設為false 8 registerWithEureka: false 9 //是否從eureka server獲取注冊信息,默認為true 10 //由於為單點的eureka server,不需要同步信息,設為false 11 fetchRegistry: false 12 //設置與eureka server交互的地址,查詢和注冊服務都經過這個地址 13 serviceUrl: 14 defaultZone: http://localhost:${server.port}/eureka/
啟動項目,即可訪問http://localhost:1001/查看eurekaServer管理中心。
2、Service節點
添加module,創建Spring Boot項目,添加Eureka Discovery Client和Eureka Server依賴。
啟動類添加@EnableEurekaClient注釋(也可用@EnableDiscoveryClient取代,效果相同,前者對應Eureka,后者適用多種注冊中心)以及@ComponentScan注釋。
修改配置文件application.yml,如下:
1 spring: 2 //服務名稱 3 application: 4 name: Service112 13 server: 14 port: 8001 15 16 //在服務中心進行注冊 17 eureka: 18 client: 19 serviceUrl: 20 defaultZone: http://localhost:8801/eureka/
配置完成后啟動項目,可在eureka管理中心看到注冊的服務。
項目中新建service和controller包,controller包中HelloController負責接受請求,並路由到service包中的具體實現,controller中僅注入service對象,然后根據請求路徑調用響應的service實現,service中負責具體的實現。
同理,按上面步驟增加第二個Service節點,注冊名為Service2,注冊在8002端口。
3、服務調用
Sping Cloud由兩種消費方式,rest+ribbon和feign兩種。
3.1、rest+ribbon調用(通過RestTemplate構造URL調用)
添加module,創建Spring Boot項目,添加Eureka Discovery Client、Eureka Server和Ribbon依賴。
啟動類添加@EnableDiscoveryClient和@ComponentScan注釋。
修改配置文件application.yml,注冊在8003端口上的Service3服務。
service包和controller包同上。
Service3調用Service1和Service2:
啟動類中注入RestTemplate對象,添加@LoadBalance、@Bean和@Autowired注釋,開啟負載均衡。
改造service包中的具體實現:
自動注入(@Autowired)RestTemplate對象,restTemplate.getForObject("http://${注冊應用名}/${請求路徑}?參數列表",String.class)。
實現遠程調用,通過注冊應用名自動負載均衡。
3.2、feign調用(通過動態代理的接口來實現接口調用,在接口中實現遠程調用)
添加module,創建Spring Boot項目,添加Eureka Discovery Client、Eureka Server和Feign依賴。
啟動類添加@EnableDiscoveryClient和@ComponentScan注釋。
修改配置文件application.yml,注冊在8004端口上的Service4服務。
service包和controller包同上。
Service4調用Service1和Service2:
新增feignRPC包,其中定義兩個接口,分別對應兩個應用Service1和Service2的調用。
service1_feign接口為:
1 @FeignClients(value = "Service1") //通過應用注冊名來調用服務 2 public interface service1_feign() { 3 @RequestMapping(value = "/${請求路徑}", method = RequestMethod.GET) 4 public String getHello(@RequestParam("service1中參數名") 具體參數); 5 }
改造service包中的具體實現:
自動注入(@Autowired)service1_feign接口,像調用本地方法那樣調用接口的方法即可實現遠程調用。
Feign集成了Ribbon,通過注冊應用名自動負載均衡。
4、體驗負載均衡機制
創建module,普通的service節點,注冊在8005端口,應用名為Service1。
在eureka server管理界面可以看到Service1有兩個服務提供者提供同名應用。
通過Service3或者Service4調用應用名為Service1的服務。
由於Ribbon默認的負載均衡策略為輪詢,通過刷新界面,可以看到一次調用module1和module5提供的服務。
5、網關Zuul的搭建
5.1、體驗網關的請求轉發功能
創建module,添加Eureka Discovery Client、Eureka Server和Zuul依賴。
啟動類添加@EnableZuulProxy注釋。
修改配置文件application.yml,注冊在6001端口上,注冊應用名為zuul。
啟動項目后,可以通過網關訪問服務:
直接http://localhost:8001/hello?name=world可以訪問Service1;
通過網關轉發,http://localhost:6001/Service1/hello?name=world訪問Service1應用,Zuul默認實現了按應用名負載均衡。
5.2、網關的自定義路由
在application.yml配置文件中配置:
1 zuul: 2 //前綴,請求路徑前必須加 3 prefix: /api 4 //自定義路由 5 routes: 6 Service1: /service_1_zuul/** 7 //禁止直接訪問后台服務 8 ignored-services: Service1
啟動項目后,訪問http://localhost:8001/hello?name=world失敗,網關禁止直接調用后台服務Service1。
通過網關訪問http://localhost:6001/api/service_1_zuul/hello?name=world,可以輪詢調用Service1和Service5。