文章目錄
- 介紹
- 技術
- 介面資料流向
- 資料表
- 新建專案
- Eurak(發現)
- Eureka的作用
- 架構
- Eurak Server代碼
- Eureka客戶端代碼
- 利用Feign實作服務間呼叫
- 介紹
- 代碼
- 利用Ribbon實作負載均衡
- 利用Hystrix實作斷路器
- 整合兩個服務
- 通過網關Zuul實作路由功能
- 兩個特點
- Zuul集成
- 實作網關過濾器
介紹
技術

之前有用eureka 現在用nacos
作業流和gateway

介面資料流向

資料表



新建專案
新建cloud-洗掉src-新建modle
Eurak(發現)
Eureka的作用
114、物業 (注冊中心、心跳機制60s失效踢除)
沒有服務注冊于發現可以,但是會引來無窮無盡的麻煩
靜態ip變更,影響多服務模塊
架構


Eurak Server代碼
新建moudle,和業務完全獨立
pom依賴,最外層pomcloud版本號
新建組態檔
注解啟動
驗證http://localhost:8000/

Eureka客戶端代碼
配置dom
配置properties
啟動client

利用Feign實作服務間呼叫
介紹
歷史
netflex -> open (捐給spring cloud)
非常方便
基于介面和注解,和本地方法一樣爽的http請求

代碼
價格中呼叫課程服務
引入依賴
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
組態檔
#openfeign消費的負載均衡后期再配
加注解
//啟動類的客戶端
@EnableFeignClients
客戶端(在呼叫類寫介面,復制被呼叫服務的controller方法)
package com.bennyrhys.course.client;
import com.bennyrhys.entity.Course;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
/**
* @Author bennyrhys
* @Date 12/27/20 8:04 PM
* 課程串列的Feign客戶端
*/
@FeignClient("course-list")
public interface CourseListClient {
@GetMapping("/course")
List<Course> getList();
}
驗證pom中(自動引入其他服務的依賴)

controller(在price服務中呼叫course服務的方法)

驗證

利用Ribbon實作負載均衡



修改組態檔
price服務呼叫course服務的負載均衡設定
#openfeign消費的負載均衡
course-list.ribbon.NFLoadBanlancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule
利用Hystrix實作斷路器
比如獲取用戶資訊卡住,但資料庫的連接池一直未被釋放,系統崩潰
斷路器保護,某一處出現問題,保證不影響全部不可用,避免故障蔓延

依賴pom
<!-- 斷路器 客戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
配置
#斷路器 客戶端(默認關閉)
feign.hystrix.enabled=true
啟動類注解
@EnableCircuitBreaker
斷路器實作類CourseListClientHystrix
package com.bennyrhys.course.client;
import com.bennyrhys.entity.Course;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
/**
* 描述: 斷路器實作類
*/
@Component
public class CourseListClientHystrix implements CourseListClient{
@Override
public List<Course> getList() {
List<Course> defaultCourses = new ArrayList<>();
Course course = new Course();
course.setId(1);
course.setCourseId(1);
course.setCourseName("默認課程");
course.setValid(1);
defaultCourses.add(course);
return defaultCourses;
}
}
指明呼叫服務的斷路器類
/**
* @Author bennyrhys
* @Date 12/27/20 8:04 PM
* 課程串列的Feign客戶端
*/
@FeignClient(value = "course-list", fallback = CourseListClientHystrix.class)
@Primary //防止呼叫服務的controller爆紅線不好看
public interface CourseListClient {
@GetMapping("/course")
List<Course> getList();
}
斷路器效果

整合兩個服務
將課程串列和課程價格進行整合
回傳物體CourseAndPrice
Integer id;
Integer courseId;
String name;
Integer price;
service
@Override
public List<CourseAndPrice> getCoursesAndPrice() {
List<CourseAndPrice> courseAndPriceList = new ArrayList<>();
List<Course> courses = courseListClient.courseList();
for (int i = 0; i < courses.size(); i++) {
Course course = courses.get(i);
if (course != null) {
CoursePrice coursePrice = getCoursePrice(course.getCourseId());
CourseAndPrice courseAndPrice = new CourseAndPrice();
courseAndPrice.setPrice(coursePrice.getPrice());
courseAndPrice.setName(course.getCourseName());
courseAndPrice.setId(course.getId());
courseAndPrice.setCourseId(course.getCourseId());
courseAndPriceList.add(courseAndPrice);
}
}
return courseAndPriceList;
}
}

通過網關Zuul實作路由功能
兩個特點

Zuul集成

新建mudle模塊sourse-zuul
引入依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
組態檔
spring.application.name=course-gateway
server.port=9000
logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}
mybatis.configuration.map-underscore-to-camel-case=true
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
#zuul.prefix=/bennyrhys
zuul.routes.course-list.path=/list/**
zuul.routes.course-list.service-id=course-list
zuul.routes.course-price.path=/price/**
zuul.routes.course-price.service-id=course-price
啟動類 注解
package com.bennyrhys.course;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* 描述: 網關啟動類
*/
@EnableZuulProxy
@SpringCloudApplication
public class ZuulGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulGatewayApplication.class, args);
}
}
效果圖

實作網關過濾器
過濾前
package com.bennyrhys.course.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
/**
* 描述: 記錄請求時間
*/
@Component
public class PreRequestFilter extends ZuulFilter {
@Override
public String filterType() {
//過濾器的型別
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
//是否啟用過濾器
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
currentContext.set("startTime", System.currentTimeMillis());
System.out.println("過濾器已經記錄時間");
return null;
}
}
過濾后
package com.bennyrhys.course.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
/**
* 描述: 請求處理后的過濾器
*/
@Component
public class PostRequestFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
Long startTime = (Long) currentContext.get("startTime");
long duration = System.currentTimeMillis() - startTime;
String requestURI = currentContext.getRequest().getRequestURI();
System.out.println("uri:" + requestURI + ",處理時長:" + duration);
return null;
}
}
uri:/bennyrhys/list/course,處理時長:919
CSDN認證博客專家
分布式
Java
架構
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/241319.html
標籤:java
