零基礎學習springcloud的五大組件

Cabbage coder 2022-01-07 19:46:52 阅读数:851

零基 springcloud 五大

前言:

謝謝大佬文章:https://www.kuangstudy.com/bbs/1374942542566551554
SpringCloud Netflix 中文文檔:https://springcloud.cc/spring-cloud-netflix.html
SpringCloud 中文API文檔(官方文檔翻譯版):https://springcloud.cc/spring-cloud-dalston.html
SpringCloud中國社區:http://springcloud.cn/
SpringCloud中文網:https://springcloud.cc

springcloud相比dubbo的技術對比:
在這裏插入圖片描述
在這裏插入圖片描述

一、項目目錄及父依賴:

在這裏插入圖片描述
首先在父依賴pom中導好要導入的包,將後續各個子模塊公用的jar包等統一提取出來,類似一個抽象父類,具體代碼見前言。

二、項目的消費者、服務提供者 api

首先是api (就是一個服務對應的實體類pojo)

package com.chao.springcloud.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@NoArgsConstructor //提供無參的構造方法
@Accessors(chain = true) //鏈式寫法
//所有的實體類必須實現序列化接口
public class Dept implements Serializable {

private Long deptno;
private String dname;
private String db_source;//這個數據是存在哪個數據庫的字段
//微服務架構:一個服務對應一個數據庫,也就是說同一個信息會存到不同的數據庫,因此需要 db_source 進行區分
/** * 鏈式寫法: * Dept dept=new Dept(); * dept.setDeptNo(11).setDname('ssss').setDb_source('001') */
}

下一個介紹8001端口的服務提供者(8002和8003也一樣)
跟普通的springboot項目沒區別 不細說了 看源碼
在這裏插入圖片描述

下面來介紹消費者 80端口
首先看一下配置文件
其中eureka有三個注册中心的集群

server:
port: 80
eureka:
client:
register-with-eureka: false #不向 eureka 注册自己
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

接下來是控制層(使用了restTemplate)(這裏是調用服務提供者給的接口)

package com.chao.springcloud.controller;
import com.chao.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class DeptConsumerController {

// 消費者不應該有 Service 層,那怎麼拿到 Service ?
// RestTemplate:提供多種便捷訪問遠程 http 服務的方法,簡單的 restful 服務模板
// 注册到 spring 中
// RestTemplace 參數:(String url, Class<T> responseType, Object... uriVariables)
@Autowired
private RestTemplate restTemplate;
//通過 Ribbon 實現的時候,地址應該是變量,請求這個應用的名字即可
//private static final String REST_URL_PREFIX="http://localhost:8001";
private static final String REST_URL_PREFIX="http://SPRINGCLOUD-PROVIDER-DEPT";
@GetMapping("/consumer/dept/get/{id}")
public Dept get(@PathVariable Long id){

return restTemplate.getForObject(REST_URL_PREFIX +"/dept/get/"+id, Dept.class);
}
@PostMapping("/consumer/dept/add")
public boolean add(Dept dept ){

return restTemplate.postForObject(REST_URL_PREFIX +"dept/add",dept,Boolean.class);
}
@GetMapping("/consumer/dept/list")
public List<Dept> list(){

return restTemplate.getForObject(REST_URL_PREFIX +"/dept/list", List.class);
}
}

PS:這裏原來是8001接口 因為當服務提供者只有8001接口一個,但是當訪問壓力過大,比如需要3個服務提供者(3個數據庫)進項負載均衡,也就是他們的名字都是SPRINGCLOUD-PROVIDER-DEPT (可見源碼的三個服務提供者的配置)

在這裏插入圖片描述

三、Eureka注册中心

這裏是3個注册中心構建的集群 (這裏就介紹7001 其他兩個都一樣)

在這裏插入圖片描述
1、首先編寫配置文件

server:
port: 7001
#Eureka
eureka:
instance:
hostname: eureka7001.com # 服務端的實例名稱
client:
register-with-eureka: false #錶示是否向 Eureka 注册中心注册自己,服務器不用注册
fetch-registry: false # false 錶示自己是注册中心
service-url:
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

2、然後開啟注解即可
在這裏插入圖片描述

四、Ribbon實現負載均衡

此處負載均衡實現代碼比特於80 消費者處
在這裏插入圖片描述
這裏是自定義的負載均衡算法
在這裏插入圖片描述
這裏是bean注入,注意這裏要實現負載均衡一定要加這個注解
在這裏插入圖片描述
然後啟動類一定要標注好即可。
在這裏插入圖片描述

五、Feign實現負載均衡

區別在於 他在api模塊加了一個service類
在這裏插入圖片描述
然後在消費方不是RestTemplate 還是大家熟悉的接口寫法調用
在這裏插入圖片描述
然後啟動類添加注解即可
在這裏插入圖片描述

六、Hystrix:服務熔斷

在這裏插入圖片描述
修改controller

/** * @Auther: csp1999 * @Date: 2020/05/17/22:06 * @Description: 提供Restful服務 */
@RestController
public class DeptController {

@Autowired
private DeptService deptService;
/** * 根據id查詢部門信息 * 如果根據id查詢出現异常,則走hystrixGet這段備選代碼 * @param id * @return */
@HystrixCommand(fallbackMethod = "hystrixGet")
@RequestMapping("/dept/get/{id}")//根據id查詢
public Dept get(@PathVariable("id") Long id){

Dept dept = deptService.queryById(id);
if (dept==null){

throw new RuntimeException("這個id=>"+id+",不存在該用戶,或信息無法找到~");
}
return dept;
}
/** * 根據id查詢備選方案(熔斷) * @param id * @return */
public Dept hystrixGet(@PathVariable("id") Long id){

return new Dept().setDeptno(id)
.setDname("這個id=>"+id+",沒有對應的信息,[email protected]~")
.setDb_source("在MySQL中沒有這個數據庫");
}
}

為主啟動類添加對熔斷的支持注解@EnableCircuitBreaker

/** * @Auther: csp1999 * @Date: 2020/05/17/22:09 * @Description: 啟動類 */
@SpringBootApplication
@EnableEurekaClient // EnableEurekaClient 客戶端的啟動類,在服務啟動後自動向注册中心注册服務
@EnableDiscoveryClient // 服務發現~
@EnableCircuitBreaker // 添加對熔斷的支持注解
public class HystrixDeptProvider_8001 {

public static void main(String[] args) {

SpringApplication.run(HystrixDeptProvider_8001.class,args);
}
}

在這裏插入圖片描述
服務降級
在這裏插入圖片描述
在這裏插入圖片描述

/** * @Auther: csp1999 * @Date: 2020/05/20/9:18 * @Description: Hystrix服務降級 ~ */
@Component
public class DeptClientServiceFallBackFactory implements FallbackFactory {

@Override
public DeptClientService create(Throwable cause) {

return new DeptClientService() {

@Override
public Dept queryById(Long id) {

return new Dept()
.setDeptno(id)
.setDname("id=>" + id + "沒有對應的信息,客戶端提供了降級的信息,這個服務現在已經被關閉")
.setDb_source("沒有數據~");
}
@Override
public List<Dept> queryAll() {

return null;
}
@Override
public Boolean addDept(Dept dept) {

return false;
}
};
}
}

在DeptClientService中指定降級配置 DeptClientServiceFallBackFactory

@Component //注册到spring容器中
//@FeignClient:微服務客戶端注解,value:指定微服務的名字,這樣就可以使Feign客戶端直接找到對應的微服務
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallBackFactory.class)//fallbackFactory指定降級配置類
public interface DeptClientService {

@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id);
@GetMapping("/dept/list")
public List<Dept> queryAll();
@GetMapping("/dept/add")
public Boolean addDept(Dept dept);
}

在springcloud-consumer-dept-feign模塊中開啟降級:

server:
port: 80
# Eureka配置
eureka:
client:
register-with-eureka: false # 不向 Eureka注册自己
service-url: # 從三個注册中心中隨機取一個去訪問
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
# 開啟降級feign.hystrix
feign:
hystrix:
enabled: true

在這裏插入圖片描述

七、Zull路由網關

首先配置文件加入zull的配置

server:
port: 9527
spring:
application:
name: springcloud-zuul #微服務名稱
# eureka 注册中心配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance: #實例的id
instance-id: zuul9527.com
prefer-ip-address: true # 顯示ip
info:
app.name: haust.springcloud # 項目名稱
company.name: 河南科技大學西苑校區 # 公司名稱
# zull 路由網關配置
zuul:
# 路由相關配置
# 原來訪問路由 eg:http://www.cspStudy.com:9527/springcloud-provider-dept/dept/get/1
# zull路由配置後訪問路由 eg:http://www.cspstudy.com:9527/haust/mydept/dept/get/1
routes:
mydept.serviceId: springcloud-provider-dept # eureka注册中心的服務提供方路由名稱
mydept.path: /mydept/** # 將eureka注册中心的服務提供方路由名稱 改為自定義路由名稱 # 不能再使用這個路徑訪問了,*: 忽略,隱藏全部的服務名稱~ ignored-services: "*" # 設置公共的前綴 prefix: /haust 

主啟動類開啟即可

/** * @Auther: csp1999 * @Date: 2020/05/20/20:53 * @Description: Zull路由網關主啟動類 */
@SpringBootApplication
@EnableZuulProxy // 開啟Zuul
public class ZuulApplication_9527 {

public static void main(String[] args) {

SpringApplication.run(ZuulApplication_9527.class,args);
}
}

在這裏插入圖片描述

結尾還有一個config沒弄 來日補上

版权声明:本文为[Cabbage coder]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071946515062.html