绕过网关缓存:地址前加/zuul
默认情况下,所有的请求都经过Zuul网关的代理.
Zuul底层就是一个servlet,通常情况下zuul会将请求交给Spring Dispatch去处理,SpringMVC去控制路由。这种情况下,zuul就会去缓存这个请求。如果有直接通过zuul但是不需要缓存:比如大文件的上传服务,这时候就应该跳过SpringDispatch,在地址前加一个 /zuul.
普通请求并不会有什么影响,但是对于图片上传(文件传输),如果也经过Zuul网关的代理,文件就会经过多次网路传输,造成不必要的网络负担。在高并发时,可能导致网络阻塞,Zuul网关不可用,这样我们的整个系统就瘫痪了。
所以,我们上传文件的请求需要绕过请求的缓存,直接通过路由到达目标微服务。
解决:
server {
listen 80;
server_name api.leyou.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
// 配置
location /api/upload {
rewrite "^/(.*)$" /zuul/$1;
}
location / {
proxy_pass http://192.168.1.109:10010;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
忽略路由匹配的路径前缀
Zuul的路由功能中,会忽略路由匹配的路径前缀,不过我们的Controller中有 /upload 路径,此时如果通过网关访问,我们的地址应该是http://api.leyou.com/api/upload/upload/image, 这是因为路由匹配的前缀 /upload 在请求转发时会被自动忽略。
这样地址看起来非常臃肿,因此我们可以禁止忽略路由前缀,
在网关中application.yml中配置:
这样,路由前缀也会作为地址一部分转发到微服务,那么我们就可以http://api.leyou.com/api/upload/image 正常访问了
注入的几种方式
1.@Value
2.
@ConfigurationProperties(prefix="jdbc")//读取主配置文件
@Data
public class JdbcProperties {
//所有属性名要和配置文件一样
private String username;
private String password;
}
@Configuration //指定为配置类
//@PropertySource("classpath:db.properties") //读取配置文件
@EnableConfigurationProperties(JdbcProperties.class)//使用JdbcProperties配置类
public class JdbcConfig {
@Bean //记得形参要写JdbcProperties,spring会自动传入进来
public DataSource getDataSource(JdbcProperties prop){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(prop.getDriverClass());
dataSource.setUrl(prop.getUrl());
dataSource.setUsername(prop.getUsername());
dataSource.setPassword(prop.getPassword());
return dataSource;
}
}
OpenFeign使用记录
ly-item-interface项目中存在api接口,方法上为注解请求的servlet地址
search-servcie项目中导入ly-item-interface项目
这样也相当于在各api的接口给上面使用的@FeignClient注解
这样只需要在api上边写上注解请求路径,client这边只需要继承对应的接口加个FeignClient注解即可