一:Nacos配置管理
1.Nacos配置管理——微服务实现配置管理
2.Nacos配置管理——微服务配置拉取
bootstrap.yml文件在application.yml之前被项目读入
同一配置管理
引入Nacos的配置管理客户端依赖:
<!--nacos的配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:
spring:
application:
name: userservice
profiles:
active: dev # 环境
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
discovery:
cluster-name: SH #集群名称,这里HZ代指杭州
config:
file-extension: yaml # 文件后缀名
在user-service中将pattern.dateformat这个属性注入到UserController中做测试
@Slf4j
@RestController
@RequestMapping("/user")
// @RefreshScope
public class UserController {
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat, Locale.CHINA));
}
}
}
3.Nacos配置管理——配置热更新
4.Nacos配置管理——多环境配置共享
5.Nacos配置管理——nacos集群搭建
链接:https://pan.baidu.com/s/1vokjKM49nJUrbzUT3MZGRA?pwd=ch93
提取码:ch93
二:http客户端Feign
1.Feign-基于Feign得远程调用
RestTemplate方式调用存在问题
String url = "http://userservice/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);
Feign的介绍
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
使用Feign的步骤:
引入依赖:
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在order-service的启动类添加注解开启Feign的功能:
@EnableFeignClients()
编写Feign客户端:
在clients包下面新建一个UserClients接口
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
用Feign客户端代替RestTemplate
2.Feign-自定义配置
配置日志的级别
- 方式一:配置文件方式
全局生效
feign:
client:
config:
default: #这里使用default就是全局配置,如果改成服务名称,则是针对某个服务
loggerLevel: FULL #日志级别
局部生效,将default改成服务名称,例如userservice
- 方式二:java代码方式,需要先声明一个Bean:
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
全局配置:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
局部配置:
@EnableFeignClients(value="userservice",defaultConfiguration = DefaultFeignConfiguration.class)
3.Feign-性能优化
Feign底层的客户端实现:
- URLConnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
因此优化Feign的性能主要包括:
- 使用连接池代替默认的URLConnection
- 日志级别,最好用basic或none
Feign添加HttpClient的支持
引入依赖:
<!--引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置连接池:
feign:
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
4.Feign-最佳实践
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
- 方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
- 方式二:指定FeignClient字节码
@EnableFeignClients(clients = UserClient.class)
三:统一网关Gateway
1.GateWay网关作用和入门
网关功能:
- 身份认证和权限校验
- 身份路由、负载均衡
- 请求限流
搭建网关服务:
1.创建新的module,引入SpringcloudGateWay的依赖和nacos的服务发现依赖:
<!--nacos服务注册发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.编写路由配置及nacos地址
server:
port: 10010 # 网关端口
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id ,自定义,只要唯一即可
uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
- Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
网关搭建步骤:
- 创建项目,引入nacos服务发现和gateway依赖
- 配置applaction.yml,包括服务基本信息,nacos地址、路由
路由配置包括:
- 路由id:路由的唯一标识
- 路由目标(uri):路由的目标地址,http代表固定地址。lb代表根据服务名称负载均衡
- 路由断言(predicates):判断路由的会泽
- 路由过滤器(filters):对请求或相应做处理
2.GateWay——路由断言工厂和路由过滤器
路由断言工厂Route Predicate Factory
路由过滤器 GatewayFilter
给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id ,自定义,只要唯一即可
uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
- Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件
filters: # 过滤器
- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
测试:
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id ,自定义,只要唯一即可
uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
- Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
default-filters: # 默认过滤器,会对所有的路由请求都生效
- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
3.GateWay——全局过滤器以及过滤器链执行顺序
自定义类,实现GlobalFilter接口,添加@Order注解:
@Order注解和Ordered接口的作用是解决过滤器执行顺序问题
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.获取请求参数
MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
// 2.获取authorization参数
String auth = params.getFirst("authorization");
// 3.校验
if("admin".equals(auth)){
// 放行
return chain.filter(exchange);
}
//4:拦截
// 4.1 禁止访问
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
// 4.2结束处理
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return 0;
}
}
4.GateWay网关——网关的跨域请求
网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期