脚本宝典收集整理的这篇文章主要介绍了2111-微服务核心知识点及问题分析,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
第二步:在sca-ui工程中创建一个springboot启动类,类全名为com.jt.DemoUIApplication.
package com.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoUIApplication {
public static void main(String[] args) {
SpringApplication.run(DemoUIApplication.class, args);
}
}
第三步:在sca-ui工程的resources目录下创建一个static目录,并在此目录中创建一个index.html页面
第四步:启动sca-ui工程,在浏览器中输入http://localhost:8080/index.html进行测试.JAVA_HOME环境变量定义错误,例如:
说明,这里一定要注意JAVA_HOME单词的拼写,JAVA_HOME中定义的JDK是存在的,还有后面的路径不能有分号“;”.MySQL版本比较低(建议mysql5.7或mariadb10.5及以上版本),例如: 当执行nacos-mysql.sql文件时,出现如下错误:
sql文件不存在,例如
SQL文件应用错误,例如:
Nacos的application.properties配置文件中,连接数据库的配置错误.
数据库的名字配置错误,例如:
nacos配置文件application.properties配置错误,例如:
服务启动时,端口被占用了。例如:
服务注册时,服务名不正确,格式不正确,配置文件名字不正确,或者没有配置文件,例如:
磁盘写权限问题(nacos服务启动时会在当前磁盘目录写日志),例如:
基于Nacos实现服务注册失败,例如
客户端500异常,例如
服务调用时,连接异常,例如:
客户端404异常,例如:
服务调用时底层404问题,例如:
服务访问问题,例如:
依赖注入异常,例如:
客户端请求方式与服务端不匹配,例如:
依赖版本问题,例如:
服务配置读取问题,例如:
@Bean
public IRule rule(){
return new RandomRule();
}
sca-provider: #基于服务名指定负载均衡策略
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
spring:
profiles: # 通过profiles指定不同环境下的配置
active: dev #bootstrap-dev.yml
/*构建一个本地cache对象*/
private CopyOnWriteArrayList<String> localCache=
new CopyOnWriteArrayList<>();
/**
* 通过这个方法,模拟从本地缓存取数据,本地缓存没有则从数据库取数据.
* @return
*/
@GetMapping("/provider/cache02")
public List<String> doUseLocalCache02(){
//1.检查本地缓存是否开启,假如没有开启
//则从数据库去取数据并返回
if(!useLocalCache){
System.out.println("Get Data from Database");
return Arrays.asList("A","B","C");//假设这是从DB中取的
}
//2.假设本地缓存已开启,则从缓存取数据,缓存没有则从数据库取,
//并将数据在缓存放一份(暂时先不考虑一致性问题)
if(localCache.isEmpty()){
System.out.println("Get Data from Database");
List<String> dbData = Arrays.asList("A", "B", "C");
localCache.addAll(dbData);
}
return localCache;
}
package com.jt.provider.controller;
/**
* 自定义BlockException的异常处理对象
*/
@Component
public class DefaultSentinelExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request,
HttpServletResponse response,
BlockException e) throws Exception {
//设置响应内容类型,以及告诉高客户端应该按什么编码显示数据
response.setContentType("text/html;charset=utf-8");
//设置响应状态码(将来可以基于这个状态码进行相关处理)
response.setStatus(429);
//获取响应输出流对象
PrintWriter out = response.getWriter();
out.print("访问太频繁,稍等片刻再访问.");
out.flush();
out.close();
}
}
package com.jt.provider.interceptor;
public class TimeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("==preHandle==");
//1.获取当前时间
LocalTime now = LocalTime.now();//LocalTime为jdk8中的一个获取当前时间的api
//2.获取当前的小时并进行逻辑判断
int hour = now.getHour();//8:10~8
System.out.println("hour="+hour);
if(hour<9||hour>18){
throw new RuntimeException("请在9~18时间范围内访问");//return false
}
return true;//false请求到此结束,true表示放行,会去执行后续的拦截器或controller对象
}
}
第三步:配置拦截器,例如:
package com.jt;
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
/**
* 注册拦截器(添加到spring容器),并指定拦截规则
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TimeInterceptor())
.addPathPatterns("/provider/sentinel01");
}
}
第四步:打开浏览器,对/provider/sentinel01路径进行访问,对访问结果进行访问。
package com.jt.provider.controller;
@Component
public class DefaultRequestOriginParser
implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
//对请求头中的数据进行解析,请求头的名字为token,然后基于值进行授权。
String token=request.getHeader("token");
return token;
}
}
第二步:在sentinel中设置授权规则,例如:
第三步:打开idea中的http client文件(例如rest-api.http),进行访问测试,例如:package com.jt.filter;
import org.apache.http.HttpHeaders;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* 课堂练习:
* 构建一个全局的请求url过滤器,
* 对请求url进行校验,合法则放行,不合法则给出反馈。
*/
@Component
public class BlackUrlGlobalFilter implements GlobalFilter,Ordered {
//定义非法url集合(在此集合中的url不允许访问我们的资源)
private List<String> blackUrls=new ArrayList<>();
public BlackUrlGlobalFilter(){
blackUrls.add("/nacos/provider/echo/9002");
blackUrls.add("/nacos/provider/echo/9003");
}
/**
* 这是一个对请求进行过滤的方法
* @param exchange 基于这个对象可以获取请求和响应对象
* @param chain 这里表示过滤链
* @return 这里的返回值为一个Mono对象(本质上是一个Publisher)
* ,这是spring5.0以后,WebFlux框架中的一个对象。
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
//1.获取请求和响应对象
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//2.获取请求路径(不需要ip和端口),例如/nacos/provider/echo/9001
String requestPath=request.getURI().getPath();
System.out.println("requestPath="+requestPath);
//3.判定请求路径是否是不允许的url,假如是则给出反馈
if(blackUrls.contains(requestPath)){
//结果处理方案1:抛出异常
//throw new RuntimeException("这个请求已被列入非法url");
//结果处理方案2:响应一个error消息(难度系数要高一些)
//告诉浏览器响应的数据类型以及以什么编码呈现数据
response.getHeaders()
.add(HttpHeaders.CONTENT_TYPE,
"text/html;charset=utf-8");
//封装响应数据
DataBuffer data=response.bufferFactory()
.wrap("当前url不允许访问资源".getBytes(StandardCharsets.UTF_8));
return response.writeWith(Mono.just(data));
}
//继续执行下一步操作
return chain.filter(exchange);
}
/**定义过滤器的优先级,数字越小,优先级越高*/
@Override
public int getOrder() {
return -1;
}
}
第一步:注释BlackUrlGlobalFilter中的构造方法,并添加set方法,例如:
//这个set方法用于在系统读取到配置信息后,对属性进行初始化。系统底层自动调用。
public void setBlackUrls(List<String> blackUrls) {
this.blackUrls = blackUrls;
}
第二步:在配置文件application.yml中添加如下配置,例如:
web:
request:
blackUrls:
- /nacos/provider/echo/9002
- /nacos/provider/echo/9003
第三步:在BlackUrlGlobalFilter类上添加如下注解,指定要读取的配置
@ConfigurationProperties("web.request")
第四步:在sca-gateway的pom文件中添加如下依赖,用于支持第三步中注解的应用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
第五步:启动服务进行访问测试。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<h2>The Index Page</h2>
<button onclick="doBuy()">Buy</button>
<span id="result"></span>
</div>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
//前端如何排错(日志,debugger,排除法)
function doBuy(){
console.log("==doBuy==");
//1.基于axios框架发送异步ajax请求
let url="http://localhost:9000/nacos/provider/echo/1"
let span=document.getElementById("result");
axios.get(url)
.then(function (response) {//请求ok,执行then
console.log(response.data);
//2.将响应结果更新到页面上
span.innerHTML = response.data
})
.catch(function (error) {
console.log(error);
});
}
</script>
</body>
</html>
第三步:在sca-gateway的配置文件或配置中心中添加跨域配置,例如:
spring:
cloud:
gateway:
globalcors: #跨域配置
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: "*"
第五步:按项目架构设计启动服务,进行测试。
http://localhost:8080/index.html
if(error.response.status==429){
spanObj.innerHTML="访问太频繁了";
}
第四步:对请求进行访问测试.
以上是脚本宝典为你收集整理的2111-微服务核心知识点及问题分析全部内容,希望文章能够帮你解决2111-微服务核心知识点及问题分析所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。