1.安装nacos2.1.2
下载ubuntu版的nocos,传到服务器,并解决。
1.1首先安装jdk:apt-getinstallopenjdk-8-jdk
1.2进行bin目录启动nacos:bashstartup.sh-mstandalone
1.3根据输出日志找到启动路径
2.开发gateWay
2.1配置pom.xml
<dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><!--<version>2021.1</version>--></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><!--<version>2021.1</version>--></dependency><!--https://mvnrepository.com/artifact/com.auth0/java-jwt--><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.18.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version><scope>compile</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter不引入spring-boot-starter-jdbc会报错--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency><!--fegin组件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--FeignClientforloadBalancing--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency></dependencies>这个版本nacos一定要需要fegin组件,虽然用不到,不然做gateway路由的时候,会提示503,死活转发到后面的服务(uri使用lb://iotServer,如果使用真实地址是没有问题)。
server:port:8888#网关地址spring:profiles:active:devapplication:name:gateway#服务名称cloud:nacos:server-addr:192.168.56.101:8848gateway:routes:-id:iotServer#uri:http://127.0.0.1:8099/uri:lb://iotServer#路由目的地址predicates:-Path=/kaying/v1/huabang/**#遇到这样的url进行拦截与转发jwt代码
//@Order(-1)@ComponentpublicclassAuthorizeFilterimplementsGlobalFilter,Ordered{@AutowiredAuthorizeDaodao;@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){StringrequestUrl=exchange.getRequest().getURI().getPath();/*获取请求地址财哥2022/10/318:15*/System.out.println("开始拦截");System.out.println(requestUrl);MultiValueMap<String,String>params=exchange.getRequest().getQueryParams();/*获取参数列表财哥2022/10/318:20*/StringloginUrl="/kaying/v1/huabang/login";if(loginUrl.equals(requestUrl)){/*进行身份验证财哥2022/10/318:17*/if(!params.containsKey("userCode")){JSONObjectjson=newJSONObject();json.put("desc","用户名不能为空");json.put("code","401");returnreturnJsonResult(exchange,json.toJSONString());}StringuserCode=params.getFirst("userCode");Stringpassword=params.getFirst("password");//查数据库进行匹配Map<String,Object>userMap=dao.queryForMap(String.format("select*fromhb_userwhereuser_code='%s'anduser_pwd='%s'andis_job='1'",userCode,password));if(userMap!=null){Useruser=newUser();//user.setUserName(userMap.get("user_name").toString());user.setUserCode(userMap.get("user_code").toString());user.setUserPwd(userMap.get("user_pwd").toString());Stringtoken=JwtUtils.getToken(user);/*获取token财哥2022/10/3113:04*/exchange.getResponse().setStatusCode(HttpStatus.OK);exchange.getResponse().getHeaders().set("Authorization",token);}else{JSONObjectjson=newJSONObject();json.put("desc","用户名或密码错误");json.put("code","401");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);returnreturnJsonResult(exchange,json.toJSONString());}returnexchange.getResponse().setComplete();}else{if(!exchange.getRequest().getHeaders().containsKey("Authorization")){JSONObjectjson=newJSONObject();json.put("desc","无token值");json.put("code","401");returnreturnJsonResult(exchange,json.toJSONString());}Stringtoken=exchange.getRequest().getHeaders().getFirst("Authorization");System.out.println("token="token);if(null==token||"".equals(token.trim())){JSONObjectjson=newJSONObject();json.put("desc","未登录");json.put("code","401");returnreturnJsonResult(exchange,json.toJSONString());}System.out.println("token1");try{System.out.println("token2");JwtUtils.checkToken(token);/*可以正常解析token就放行财哥2022/10/3115:25*/System.out.println("token3");returnchain.filter(exchange);/*放行财哥2022/10/3115:25*/}catch(Exceptionex){System.out.println("token4");JSONObjectjson=newJSONObject();json.put("desc","token验证失败");json.put("code","401");returnreturnJsonResult(exchange,json.toJSONString());}}}/***拦截并返回自定义的json字符串*/privateMono<Void>returnJsonResult(ServerWebExchangeexchange,Stringmsg){ServerHttpResponseresponse=exchange.getResponse();//response.setStatusCode(HttpStatus.OK);//这里在返回头添加编码,否则中文会乱码response.getHeaders().add("Content-Type","application/json;charset=UTF-8");byte[]bytes=JSON.toJSONBytes(msg,SerializerFeature.WriteMapNullValue);DataBufferbuffer=response.bufferFactory().wrap(bytes);returnresponse.writeWith(Mono.just(buffer));}@OverridepublicintgetOrder(){return-1;}}