0 環境
系統環境:win10
編輯器:IDEA
1 提供者提供消費接口
首先提供者提供訪問接口 然后創建消費者 消費這個訪問接口
// 提供接口 @RestController public class HelloController { @GetMapping("/hello") public String hello(){ return "hello provider"; } }
2 創建消費者&基本使用
創建消費者需要獲取provider(提供者)的接口地址 需要到eureka server中查找 先寫死訪問地址 慢慢解耦 這個東東到底好在哪里
1 依賴
添加web client依賴 一會要用到 還是創建springboot項目的方式
2 yml配置
spring: application: name: consumer server: port: 1301 eureka: client: service-url: defaultZone: http://localhost:1234/eureka
3 消費接口
// 下面的消費接口都需要這個 // 以前需要添加啟動注解 現在不需要添加 即可使用 @Autowired DiscoveryClient discoveryClient;
/** * @Description: 消費者和提供者直接連接 強耦合 未通過server * @Param: * @return: 正確 -> 返回提供者定死的hello里的返回值 失敗 -> error * @Author: 水面行走 * @Date: 2020/2/27 */ @GetMapping("/useHello") public String useHello(){ // HttpURLConnection發起請求 寫死provider地址 HttpURLConnection connection = null; try { // 新建url openConnxxx打開連接 -> HttpURLConnection URL url = new URL("http://localhost:1300/hello"); connection = (HttpURLConnection) url.openConnection(); // 若是200 讀取 if (200 == connection.getResponseCode()) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); // 就一行的字符串 不需要遍歷了 String s = reader.readLine(); return s; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return "use error"; }
4 啟動項目
5 消費接口改造
/** * @Description: 改造1 通過server查詢需要獲取提供者的信息(在上面的基礎連接上進行升級改造) * @Param: * @return: * @Author: xxxxx * @Date: 2020/2/xx */ @GetMapping("/useHello1") public String userHello1(){
// 由於查詢到的服務列表是一個集合 可能是集合化部署 集合中每一項就是一個實例 List<ServiceInstance> provider = discoveryClient.getInstances("provider"); for (ServiceInstance serviceInstance : provider) { // 獲取host port stringbuffer->append追加 String host = serviceInstance.getHost(); int port = serviceInstance.getPort(); // 類似格式 http://localhost:1300/hello // 上面的寫死這個格式 現在是動態獲取 拼接 最后在轉換 其他一樣的 StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("http://") .append(host) .append(":") .append(port) .append("/hello"); System.out.println("格式轉換:"+stringBuffer.toString()); HttpURLConnection connection = null; try { // 在通過tostring轉化為需要的url // 新建url openConnxxx打開連接 -> HttpURLConnection URL url = new URL(stringBuffer.toString()); connection = (HttpURLConnection) url.openConnection(); // 若是200 讀取 if (200 == connection.getResponseCode()) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); // 就一行的字符串 不需要遍歷了 String s = reader.readLine(); return s; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return "error"; }
6 重啟項目
7 集群化部署&簡單的負載均衡
// 為了體驗負載均衡的效果 添加了一個port數值 @RestController public class HelloController { @Value("${server.port}") Integer port; @GetMapping("/hello") public String hello(){ return "hello provider" + port; } }
首先修改提供者接口 打包提供者 打包成功后 定位到提供者target目錄 右鍵打開命令行 輸入java -jar xxx.jar --server.port=xxxx(啟動提供者)
為了實現簡單負載均衡(取余) 最好全部重啟一下 開啟server provider consumer(啟動前 添加下面的代碼)
/** * @Description: 改造2 集群式+負載均衡(取余) * @Param: * @return: * @Author: * @Date: 2020/2/xx */ @GetMapping("/useHello2") public String userHello2(){ // 由於查詢到的服務列表是一個集合 可能是集合化部署 集合中每一項就是一個實例 List<ServiceInstance> provider = discoveryClient.getInstances("provider"); // for (ServiceInstance serviceInstance : provider) { int count = 0; // System.out.println((count) % provider.size()); ServiceInstance serviceInstance = provider.get((count++) % provider.size()); // 獲取host port stringbuffer->append追加 String host = serviceInstance.getHost(); int port = serviceInstance.getPort(); // 類似格式 http://localhost:1300/hello // 上面的寫死這個格式 現在是動態獲取 拼接 最后在轉換 其他一樣的 StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("http://") .append(host) .append(":") .append(port) .append("/hello"); // System.out.println("格式轉換:"+stringBuffer.toString()); HttpURLConnection connection = null; try { // 在通過tostring轉化為需要的url // 新建url openConnxxx打開連接 -> HttpURLConnection URL url = new URL(stringBuffer.toString()); connection = (HttpURLConnection) url.openConnection(); // 若是200 讀取 if (200 == connection.getResponseCode()) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); // 就一行的字符串 不需要遍歷了 String s = reader.readLine(); return s; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // } return "error"; }
3 升級改造
2方面動手: http調用 --> spring提供RestTemplate 負載均衡 --> Ribbon
1 http調用
http調用 將HttpURLConnection以及下面的那一段 用RestTemplate替換
application中添加 ---------------------------- @Bean RestTemplate restTemplate(){ return new RestTemplate(); } ----------------------------------- @Autowired DiscoveryClient discoveryClient; @GetMapping("/useHello3") public String userHello3() { // 由於查詢到的服務列表是一個集合 可能是集合化部署 集合中每一項就是一個實例 List<ServiceInstance> provider = discoveryClient.getInstances("provider"); // for (ServiceInstance serviceInstance : provider) { int count = 0; // System.out.println((count) % provider.size()); ServiceInstance serviceInstance = provider.get((count++) % provider.size()); // 獲取host port stringbuffer->append追加 String host = serviceInstance.getHost(); int port = serviceInstance.getPort(); // 類似格式 http://localhost:1300/hello // 上面的寫死這個格式 現在是動態獲取 拼接 最后在轉換 其他一樣的 StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("http://") .append(host) .append(":") .append(port) .append("/hello"); // System.out.println("格式轉換:"+stringBuffer.toString()); String s = restTemplate.getForObject(stringBuffer.toString(), String.class); return s; }
2 開啟負載均衡
application中添加bean ---------------------------------- @Bean // 負載均衡注解 @LoadBalanced RestTemplate restTemplateOne(){ return new RestTemplate(); } ------------------------------------------------- controller層添加 ====================== @Autowired DiscoveryClient discoveryClient; @Autowired @Qualifier("restTemplateOne") RestTemplate restTemplateOne; @GetMapping("/useHello4") public String userHello4() { String address = "http://provider/hello"; String retStr = restTemplateOne.getForObject(address, String.class); return retStr; }
3 效果
4 小結
給RestTemplate添加負載均衡的注解 開啟它 具備了負載均衡 可以理解為RestTemplate = http調用 + 負載均衡