該系列項目整體介紹及源代碼請參照前面寫的一篇文章??????【springcloud學習(dalston.sr1)】項目整體介紹(含源代碼)(一)
?springcloud學習(dalston.sr1)系統文章匯總如下:
【springcloud學習(dalston.sr1)】項目整體介紹(含源代碼)(一)
【springcloud學習(dalston.sr1)】Eureka服務端集群的搭建(含源代碼)(二)
【springcloud學習(dalston.sr1)】Eureka單個服務端的搭建(含源代碼)(三)
【springcloud學習(dalston.sr1)】Eureka 客戶端服務注冊(含源代碼)(四)
【springcloud學習(dalston.sr1)】服務消費者通過restTemplate來訪問服務提供者(含源代碼)(五)
【springcloud學習(dalston.sr1)】Eureka 服務發現(含源代碼)(六)
【springcloud學習(dalston.sr1)】Ribbon負載均衡(含源代碼)(七)
【springcloud學習(dalston.sr1)】使用Feign實現接口調用(含源代碼)(八)
【springcloud學習(dalston.sr1)】Hystrix服務熔斷(含源代碼)(九)
【springcloud學習(dalston.sr1)】Hystrix服務降級(含源代碼)(十)
【springcloud學習(dalston.sr1)】Hystrix Dashboard服務監控(含源代碼)(十一)
【springcloud學習(dalston.sr1)】Zuul路由訪問映射規則配置及使用(含源代碼)(十二)
【springcloud學習(dalston.sr1)】Config配置中心-ConfigServer端與Git通信(含源代碼)(十三)
【springcloud學習(dalston.sr1)】Config配置中心-Configclient端通過和Config server端通信來獲取配置文件信息(含源代碼)(十四)
一般情況下,我們遠程調用服務,可以用restTemplate來進行http請求的訪問。接下來,我們會創建一個服務消費者,利用restTemplate來調用服務提供者的接口localhost:8001/goods/list
前面我們創建好了eureka服務端模塊 microservicecloud-eureka-7001和服務提供者項目microservicecloud-provider-8001。
(一)啟動eureka服務端模塊 microservicecloud-eureka-7001和服務提供者項目microservicecloud-provider-8001
我們首先啟動eureka服務端項目和服務提供者項目,然后確認服務提供者能正常訪問,在瀏覽器輸入鏈接地址:localhost:8001/goods/list?
(二)創建服務消費者項目
該模塊創建后的整體代碼結構如下microservicecloud-consumer-80
(1)pom文件內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud2025</artifactId><groupId>com.company</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>microservicecloud-consumer-80</artifactId><dependencies><dependency><groupId>com.company</groupId><artifactId>microservicecloud-api</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- ribbon相關 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency></dependencies></project>
(2)創建應用配置文件application.yml
server:port: 80eureka:client:register-with-eureka: false #false表示不向注冊中心注冊自己service-url:defaultZone: http://localhost:7001/eureka/ #如果是訪問eureka集群,則配置為http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
(3)創建啟動類
package com.company.consumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient
public class Consumer80Application {public static void main(String[] args) {SpringApplication.run(Consumer80Application.class, args);}
}
(4)創建controller
package com.company.consumer.controller;import com.company.api.entity.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.util.List;@RestController
@RequestMapping("/consumer")
public class GoodsConsumerContrller {/*** http URL*/private static final String REST_URL_PREFIX_HTTP = "http://localhost:8001";/*** 通過應用名稱的訪問地址(應用名稱等同于IP + 端口)*/private static final String REST_URL_PREFIX_APPLICATION_SERVICE_NAME = "http://MICROSERVICECLOUD-GOODS";@Autowiredprivate RestTemplate restTemplate;@GetMapping("/goods/list/http")public List<Goods> getGoodsHttp() {return restTemplate.exchange(REST_URL_PREFIX_HTTP + "/goods/list", HttpMethod.GET,null, new ParameterizedTypeReference<List<Goods>>(){}).getBody();}@GetMapping("/goods/list/applicationName")public List<Goods> getGoodsServiceName() {return restTemplate.exchange(REST_URL_PREFIX_APPLICATION_SERVICE_NAME + "/goods/list", HttpMethod.GET,null, new ParameterizedTypeReference<List<Goods>>(){}).getBody();}@GetMapping("/goods/list/hystrix")public List<Goods> getGoodsHystrix() {return restTemplate.exchange(REST_URL_PREFIX_APPLICATION_SERVICE_NAME + "/goods/list/hystrix", HttpMethod.GET,null, new ParameterizedTypeReference<List<Goods>>(){}).getBody();}
}
(5)創建一個配置類,將restTemplate納入到spring 容器進行管理
package com.company.consumer.config;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class ConfigBean {@Bean//@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}/*** 設置ribbon負載均衡的算法,默認是輪詢算法,也即每個都輪詢一次。* @return*///@Beanpublic IRule myRule() {return new RoundRobinRule();// 默認是輪詢算法,也即每個都輪詢一次。// return new RandomRule(); 現在采用隨機的算法//return new RetryRule(); //如果provider都是正常的話,則輪詢。如果有1個不可用的話,則在嘗試幾次失敗后,會自動輪詢能正常使用的服務}
}
(三)啟動服務消費者項目,驗證效果
這里注意,我們前面已經事先啟動好了eureka服務端模塊 microservicecloud-eureka-7001和服務提供者項目microservicecloud-provider-8001
現在我們使用restTemplate通過IP + 端口方式調用服務提供者的接口(使用http://localhost/consumer/goods/list/http)
通過服務消費者microservicecloud-consumer-80模塊的創建,我們在controller中定義了接口/consumer/goods/list/http?,并且在該接口中通過restTemplate來訪問服務提供者microservicecloud-provider-8001
的?localhost:8001/goods/list接口。
我們啟動服務消費者項目microservicecloud-consumer-80,然后在瀏覽器中訪問 http://localhost/consumer/goods/list/http
如果結果能正常返回,則說明通過restTemplate調用成功
如下圖:
(2)使用服務名稱進行調用(代替IP + 端口方式)(使用http://MICROSERVICECLOUD-GOODS/consumer/goods/list/http)
由于該項目也是作為Eureka的客戶端,其調用也可以通過服務名稱方式進行直接調用。
比如服務提供方的地址是?localhost:8001/goods/list ,從eureka注冊列表可以看到服務名稱是MICROSERVICECLOUD-GOODS
如下圖:
注意eureka服務提供者的名稱,取決于服務提供者項目microservicecloud-provider-8001中的application.yml配置文件中的spring.application.name=microservicecloud-goods配置項,eureka server端網頁里會展示為大寫
由于通過服務名需要啟用負載均衡注解 @LoadBalanced,這里需要修改下配置Bean,去掉前面的注釋(前面通過IP + 端口方式訪問時,通過//注釋掉了該注解),以正式啟用該注解,如下圖
這里我們嘗試訪問http://localhost/consumer/goods/list/applicationName,該接口的url里換成了服務名,如下圖:
在瀏覽器中訪問http://localhost/consumer/goods/list/applicationName,頁面正常展示返回結果,說明能通過服務名稱來訪問到服務提供者的接口。
注意:因為@LoadBalanced這個注解是加在restTemplate上面的,如果還想通過IP + 端口方式訪問,則需要注掉該注解,否則進行restTemplate調用訪問時會報以下錯