1.微服务技术架构
2服务远程调用
原理
类似浏览器和ajax发送请求
使用java进行url请求
使用步骤
-
在配置类中注册RestTemplate
@Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
-
发起Url请求
//发送url请求查询用户 String url = "http://127.0.0.1:8081/user/" +order.getUserId(); User user = restTemplate.getForObject(url, User.class); //封装 order.setUser(user);
3.Eureka注册中心
为了应对企业中服务环境变化,在代码中不能使用硬编码。
当服务提供者挂掉:
搭建
-
创建项目,引入依赖
<!-- 若父工程pom引入过了cloud则不需要再次引入 --> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> ... </dependencies>
-
编写启动类,添加@EnableEurekaServer注解
@EnableEurekaServer @SpringBootApplication public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); } }
-
添加配置文件application.yml
server: port: 8888 spring: application: name: eurekaserver #服务名称 eureka: client: service-url: #地址信息,将自己注册,方便集群 defaultZone: http://127.0.0.1:8888/eureka
-
访问地址
注册服务
-
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
在配置文件中编写配置
spring: application: name: userservice eureka: client: service-url: defaultZone: http://127.0.0.1:8888/eureka
拉取服务
-
修改服务url
String url = "http://userservice/user/" +order.getUserId();
-
添加负载均衡注解
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
-
重启服务进行查询即可
4.Ribbon负载均衡
原理
负载均衡策略
修改策略
两种方式
-
代码方式:在配置类中定义一个新的IRule
@Bean public IRule randomRule(){ return new RandomRule(); }
-
配置文件方式(哪个服务做的负载均衡就在哪个服务的配置文件中写)
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
注:代码方式针对任何进行微服务的访问都进行这种方式的负载均衡,而配置文件方式只针对配置的服务
饥饿加载
ribbon:
eager-load:
enabled: true
clients:
- userserivce
5.Nacos注册中心
阿里巴巴产品,比Eureka功能更加丰富
安装
github下载源码解压,进入bin目录执行命令(单机启动)
startup.cmd -m standalone
默认端口8848,浏览器访问即可http://127.0.0.1:8848/nacos/
默认的账号和密码都是nacos
注册服务
添加依赖
父工程:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
客户端:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
添加配置
直接在spring下添加就行
xxxxxxxxxx spring: cloud: nacos: server-addr: 127.0.0.1:8848yaml
查看服务
服务分级存储
一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:
微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。
配置集群
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: NJ # 集群名称
再次复制一个配置
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
重启服务
同集群优先负载均衡
修改order的负载均衡规则
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
重启运行发现除非同集群全部挂掉,不然不会访问非同集群
根据权重进行负载均衡
权重低的被访问次数少
环境隔离
不在同一命名空间中的服务无法相互访问
设置命名空间
服务分配
在服务配置文件中添加namespace,值是命名空间ID
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
cluster-name: NJ
namespace: 1f79429e-cc62-42ac-907b-f7cb9c15b84f
重启服务
原理
- 临时实例down了,nacos直接删除
- 非临时实例down了,nacos标记为不健康,等待服务重新上线
- 当实例down了,nacos会主动发送变更消息给消费者,更新缓存
设置非临时实例
在服务配置中设置ephemeral为false
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
cluster-name: NJ
namespace: 1f79429e-cc62-42ac-907b-f7cb9c15b84f
ephemeral: false
默认都是临时实例
配置管理
新建配置
- ID名格式:[服务名称]-[profile].[后缀名]
- 配置内容中填写需要进行热更新的配置,不要将所有配置都写入nacos中
配置拉取
-
引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
添加bootstrap.yml文件,是引导文件,优先级高于application.yml
spring: application: name: userservice #服务名称 profiles: active: dev #开发环境 cloud: nacos: server-addr: 127.0.0.1:8848 #nacos地址 config: file-extension: yaml #文件后缀名 namespace: 1f79429e-cc62-42ac-907b-f7cb9c15b84f #命名空间
-
重启服务,测试配置是否获取成功
@Value("${pattern.dateformat}") private String dateformat; @RequestMapping("now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat)); }
配置热更新
-
配置自动刷新
-
方式一:在value注解所在的类,添加@RefreshScope注解
@Slf4j @RestController @RefreshScope @RequestMapping("/user") public class UserController { @Value("${pattern.dateformat}") private String dateformat; }
-
方式二:使用@ConfigurationProperties注解。
@Data @Configuration @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateformat; } //修改获取配置 @Autowired private PatternProperties patternProperties; @RequestMapping("now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat())); }
注意:使用此注解需要添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
-
-
修改配置并发布
# pattern:
# dateformat: yyyy-MM-dd HH:mm:ss
pattern:
dateformat: yyyy年MM月dd日 HH:mm:ss
多环境配置共享
读取公共配置
@Data
@Component
//@Configuration 被CGlib代理,序列化会有问题
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
private String envSharedValue;
}
:8081运行在dev环境,:8082运行在test环境
结果
配置优先级
在本地配置文件中写入
pattern:
envSharedValue: "测试配置优先级"
查看结果
在远端dev配置文件中写入
结果
所以优先级是:服务名-profile.yaml > 服务名.yaml >本地配置
集群搭建
-
创建nacos数据库,并创建表
CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) DEFAULT NULL, `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_aggr */ /******************************************/ CREATE TABLE `config_info_aggr` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) NOT NULL COMMENT 'group_id', `datum_id` varchar(255) NOT NULL COMMENT 'datum_id', `content` longtext NOT NULL COMMENT '内容', `gmt_modified` datetime NOT NULL COMMENT '修改时间', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_beta */ /******************************************/ CREATE TABLE `config_info_beta` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_tag */ /******************************************/ CREATE TABLE `config_info_tag` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `tag_id` varchar(128) NOT NULL COMMENT 'tag_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_tags_relation */ /******************************************/ CREATE TABLE `config_tags_relation` ( `id` bigint(20) NOT NULL COMMENT 'id', `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `nid` bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = group_capacity */ /******************************************/ CREATE TABLE `group_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = his_config_info */ /******************************************/ CREATE TABLE `his_config_info` ( `id` bigint(64) unsigned NOT NULL, `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `data_id` varchar(255) NOT NULL, `group_id` varchar(128) NOT NULL, `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL, `md5` varchar(32) DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `src_user` text, `src_ip` varchar(50) DEFAULT NULL, `op_type` char(10) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = tenant_capacity */ /******************************************/ CREATE TABLE `tenant_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; CREATE TABLE `tenant_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `kp` varchar(128) NOT NULL COMMENT 'kp', `tenant_id` varchar(128) default '' COMMENT 'tenant_id', `tenant_name` varchar(128) default '' COMMENT 'tenant_name', `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; CREATE TABLE `users` ( `username` varchar(50) NOT NULL PRIMARY KEY, `password` varchar(500) NOT NULL, `enabled` boolean NOT NULL ); CREATE TABLE `roles` ( `username` varchar(50) NOT NULL, `role` varchar(50) NOT NULL, UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE ); CREATE TABLE `permissions` ( `role` varchar(50) NOT NULL, `resource` varchar(255) NOT NULL, `action` varchar(8) NOT NULL, UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE ); INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
-
修改cluster.conf.example为cluster.confexample并配置
127.0.0.1:8845 127.0.0.1:8846 127.0.0.1:8847
-
修改application.properties文件,添加数据库配置(要删除注释)
spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=123456
-
复制,注意,目录路径不能有中文
-
修改每个nacos的单独配置(端口号)
-
分别启动
startup.cmd
-
配置nginx(nginx.conf) 随便找个地方粘贴即可
upstream nacos-cluster { server 127.0.0.1:8845; server 127.0.0.1:8846; server 127.0.0.1:8847; } server { listen 80; server_name localhost; location /nacos { proxy_pass http://nacos-cluster; } }
-
运行nginx
start nginx.exe
-
修改服务代码配置
nacos: # server-addr: 127.0.0.1:8848 #nacos地址 server-addr: 127.0.0.1:80
-
启动服务,访问127.0.0.1/nacos即可
-
当在nacos进行配置时,会存储进数据库
6.Feign
基本使用
声明式http客户端
-
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- 启动如果报错可能要添加下面的依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
-
在启动类添加注解@EnableFeginClients
@MapperScan("cn.itcast.order.mapper") @SpringBootApplication @EnableFeignClients public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
-
声明远程调用,编写Feign客户端
@FeignClient("userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
-
调用
@Autowired private UserClient userClient; User user = userClient.findById(orderId);
自定义配置
方式一
在服务中定义配置
#feign自定义日志级别
feign:
client:
config:
default: #default就是对所有服务进行设置,如果是指定的服务名就是对指定服务配置
loggerLevel: FULL
方式二
代码方式
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
性能优化
修改连接池
-
引入依赖
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
-
配置连接池
feign: httpclient: enabled: true #开启feign对httpclient支持 max-connections: 200 #最大连接数 max-connections-per-route: 50 #每个路径最大连接数
最佳实践
方式一(不推荐)
耦合较高,且业务参数还是要重写注解
方式二
方式二实现步骤:
-
创建feign-api module,引入feign的starter依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
将服务中的Client,实体类,feign配置都复制到module中
-
在原服务引入feign-api依赖
<!-- 引入自定义feign-api--> <dependency> <groupId>cn.itcast.demo</groupId> <artifactId>feign-api</artifactId> <version>1.0</version> </dependency>
-
修改原服务导包配置
-
重启服务
注:当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。两种解决方案:
方式一:指定FeignClient所在包
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class,basePackages = "cn.rokned.feign")
方式二:执行FeignClient字节码
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class,clients = {UserClient.class})
7.统一网关GateWay
搭建网关
-
引入依赖(网关依赖,nacos服务发现依赖)
<!-- nacos发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 网关依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
创建网关main函数
@SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class,args); } }
-
编写路由配置及nacos地址
server: port: 10010 #网关端口 spring: application: name: gateway #服务名称 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #nacos地址 gateway: routes: - id: user-service #路由id,自定义,唯一即可 # uri: http://127.0.0.1:8081 #路由目标地址,http就是固定地址 uri: lb://userservice #路由目标地址,lb是负载均衡,后面跟服务名 predicates: #路由断言,判断请求是否符合路由规则条件 - Path=/user/** #按照路径匹配,只要以/user开头就符合要求 - id: order-service uri: lb://orderservice predicates: - Path=/order/**
-
启动服务,访问网关
路由断言工厂
路由过滤器
可以对进入网关的请求和微服务返回的相应做处理,详情见spring官网
部分路由过滤
所有路由过滤
全局过滤器
@Component
//@Order(-1)
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> queryParams = request.getQueryParams();
//2.获取参数中authorize值
String authorize = queryParams.getFirst("authorize");
//3.判断
//放行
if("admin".equals(authorize)){
return chain.filter(exchange);
}
//拦截
//设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
//设置过滤优先级,注解或者实现order都行
@Override
public int getOrder() {
return -1;
}
}
过滤器顺序
跨域处理
同样是CORS方案,在配置文件中进行配置即可。
spring:
cloud:
gateway:
routes:
- id: user-service #路由id,自定义,唯一即可
# uri: http://127.0.0.1:8081 #路由目标地址,http就是固定地址
uri: lb://userservice #路由目标地址,lb是负载均衡,后面跟服务名
predicates: #路由断言,判断请求是否符合路由规则条件
- Path=/user/** #按照路径匹配,只要以/user开头就符合要求
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
globalcors: #全局跨域处理
add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
cors-configurations:
'[/**]':
allowed-origins: #允许哪些网站的跨域请求
- "http://127.0.0.1:8090"
allowedMethods: #允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" #允许在请求中携带的头信息
allowCredentials: true #是否允许携带cookie
max-age: 360000 #这次跨域检测的有效期