当前位置:   article > 正文

黑马头条Day01-环境搭建、SpringCloud_黑马头条项目介绍

黑马头条项目介绍

一、项目介绍

1. 项目背景介绍

项目概述

类似于今日头条,是一个新闻资讯类项目。

随着智能手机的普及,人们更加习惯于通过手机来看新闻。由于生活节奏的加快,很多人只能利用碎片时间来获取信息,因此,对于移动资讯客户端的需求也越来越高。黑马头条项目正是在这样背景下开发出来。黑马头条项目采用当下火热的微服务+大数据技术架构实现。本项目主要着手于获取最新最热新闻资讯,通过大数据分析用户喜好精确推送咨询新闻。

业务说明

项目术语

2. 技术栈说明

基础层

服务层

3. 课程概述

收获

项目课程大纲

二、nacos

1. 服务器环境准备

前提条件:安装VWware

①解压课前资料提供的虚拟机镜像,放到你喜欢的位置

②打开VWware,点击“打开虚拟机”,选择CentosOS7-hmtt.vmx文件

③修改虚拟网络配置,子网IP改为192.168.200.0

④修改系统的网络适配器

⑤开启虚拟机,使用MobaXterm连接虚拟机

用户名:root  密码:itcast

2. nacos安装

①docker拉取镜像

docker pull nacos/nacos-server:1.2.0

②创建容器

docker run --env MODE=standalone --name nacos --restart=always -d -p 8848:8848 nacos/nacos-server:1.2.0
  • MODE=standalone:单机版
  • --restart=always:开机启动
  • -p 8848:8848:映射端口
  • -d:创建一个守护式容器在后台运行

③访问地址:http://192.168.200.130:8848/nacos

三、初始工程搭建

1. 环境准备

项目依赖环境:

  • JDK 1.8
  • Intellij Idea
  • maven-3.6.1
  • Git

步骤:

①把课前资料的heima-leadnews.zip拷贝解压到一个不带空格和中文的目录下,使用idea打开

如果识别不出来是SpringBoot工程,打开一个pom.xml文件,右键 > add as maven project

②把pom.xml里报错的信息改成如下

③把Encoding改为UTF-8

④修改maven仓库为课前资料里提供的MAVEN仓库

2. 项目结构

common模块:主要定义了一些全局异常类

feign-api模块:主要定义了远程调用接口

gateway模块:管理网关微服务

model模块:实体类

service模块:微服务工程

test模块:项目中常用的测试

utils模块:项目中常用的工具类

四、登录

1. 需求分析

用户点击开始使用:登录后的用户权限较大,可以查看,也可以操作(点赞、关注、评论)

用户点击不登录,先看看:游客只有查看的权限

2. 表结构分析

关于app端用户相关的内容较多,可以单独设置一个库leadnews_user

①启动MySQL服务,连接数据库,执行课前资料里提供的SQL脚本

②user表(放到model包下的user.pojos包)

  1. package com.heima.model.user.pojos;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. import lombok.Data;
  7. import java.io.Serializable;
  8. import java.util.Date;
  9. /**
  10. * <p>
  11. * APP用户信息表
  12. * </p>
  13. *
  14. * @author itheima
  15. */
  16. @Data
  17. @TableName("ap_user")
  18. public class ApUser implements Serializable {
  19. private static final long serialVersionUID = 1L;
  20. /**
  21. * 主键
  22. */
  23. @TableId(value = "id", type = IdType.AUTO)
  24. private Integer id;
  25. /**
  26. * 密码、通信等加密盐
  27. */
  28. @TableField("salt")
  29. private String salt;
  30. /**
  31. * 用户名
  32. */
  33. @TableField("name")
  34. private String name;
  35. /**
  36. * 密码,md5加密
  37. */
  38. @TableField("password")
  39. private String password;
  40. /**
  41. * 手机号
  42. */
  43. @TableField("phone")
  44. private String phone;
  45. /**
  46. * 头像
  47. */
  48. @TableField("image")
  49. private String image;
  50. /**
  51. * 0 男
  52. 1 女
  53. 2 未知
  54. */
  55. @TableField("sex")
  56. private Boolean sex;
  57. /**
  58. * 0 未
  59. 1 是
  60. */
  61. @TableField("is_certification")
  62. private Boolean certification;
  63. /**
  64. * 是否身份认证
  65. */
  66. @TableField("is_identity_authentication")
  67. private Boolean identityAuthentication;
  68. /**
  69. * 0正常
  70. 1锁定
  71. */
  72. @TableField("status")
  73. private Boolean status;
  74. /**
  75. * 0 普通用户
  76. 1 自媒体人
  77. 2 大V
  78. */
  79. @TableField("flag")
  80. private Short flag;
  81. /**
  82. * 注册时间
  83. */
  84. @TableField("created_time")
  85. private Date createdTime;
  86. }

手动加密(md5 + 随机字符串)

md5是不可逆加密,md5相同的密码每次加密都一样,不太安全。在md5的基础上手动加盐(salt)处理。

3. app登录

①在service模块下新建如下

bootstrap.yml配置如下:

  1. server:
  2. port: 51801
  3. spring:
  4. application:
  5. name: leadnews-user
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 192.168.200.130:8848
  10. config:
  11. server-addr: 192.168.200.130:8848
  12. file-extension: yml

在nacos中创建配置文件 leadnews-user(注意修改数据库连接密码)

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.jdbc.Driver
  4. url: jdbc:mysql://localhost:3306/leadnews_user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
  5. username: root
  6. password: 123456
  7. # 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
  8. mybatis-plus:
  9. mapper-locations: classpath*:mapper/*.xml
  10. # 设置别名包扫描路径,通过该属性可以给包中的类注册别名
  11. type-aliases-package: com.heima.model.user.pojos

logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <!--定义日志文件的存储地址,使用绝对路径-->
  4. <property name="LOG_HOME" value="e:/logs"/>
  5. <!-- Console 输出设置 -->
  6. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  7. <encoder>
  8. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
  9. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  10. <charset>utf8</charset>
  11. </encoder>
  12. </appender>
  13. <!-- 按照每天生成日志文件 -->
  14. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  15. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  16. <!--日志文件输出的文件名-->
  17. <fileNamePattern>${LOG_HOME}/leadnews.%d{yyyy-MM-dd}.log</fileNamePattern>
  18. </rollingPolicy>
  19. <encoder>
  20. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  21. </encoder>
  22. </appender>
  23. <!-- 异步输出 -->
  24. <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
  25. <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
  26. <discardingThreshold>0</discardingThreshold>
  27. <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
  28. <queueSize>512</queueSize>
  29. <!-- 添加附加的appender,最多只能添加一个 -->
  30. <appender-ref ref="FILE"/>
  31. </appender>
  32. <logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
  33. <appender-ref ref="CONSOLE"/>
  34. </logger>
  35. <logger name="org.springframework.boot" level="debug"/>
  36. <root level="info">
  37. <!--<appender-ref ref="ASYNC"/>-->
  38. <appender-ref ref="FILE"/>
  39. <appender-ref ref="CONSOLE"/>
  40. </root>
  41. </configuration>

②接口定义

③新增LoginDto

  1. package com.heima.model.user.dtos;
  2. import lombok.Data;
  3. @Data
  4. public class LoginDto {
  5. /**
  6. * 手机号
  7. */
  8. private String phone;
  9. /**
  10. * 密码
  11. */
  12. private String password;
  13. }

④思路分析

⑤实现

UserApplication

  1. package com.heima.user;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6. @SpringBootApplication
  7. @EnableDiscoveryClient
  8. @MapperScan("com.heima.user.mapper")
  9. public class UserApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(UserApplication.class, args);
  12. }
  13. }

ApUserMapper

  1. package com.heima.user.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.heima.model.user.pojos.ApUser;
  4. import org.apache.ibatis.annotations.Mapper;
  5. @Mapper
  6. public interface ApUserMapper extends BaseMapper<ApUser> {
  7. }

ApUserService

  1. package com.heima.user.service;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import com.heima.model.common.dtos.ResponseResult;
  4. import com.heima.model.user.dtos.LoginDto;
  5. import com.heima.model.user.pojos.ApUser;
  6. public interface ApUserService extends IService<ApUser> {
  7. /**
  8. * app登录功能
  9. * @param dto
  10. * @return
  11. */
  12. public ResponseResult login(LoginDto dto);
  13. }

ApUserServiceImpl

  1. package com.heima.user.service.impl;
  2. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.heima.model.common.dtos.ResponseResult;
  5. import com.heima.model.common.enums.AppHttpCodeEnum;
  6. import com.heima.model.user.dtos.LoginDto;
  7. import com.heima.model.user.pojos.ApUser;
  8. import com.heima.user.mapper.ApUserMapper;
  9. import com.heima.user.service.ApUserService;
  10. import com.heima.utils.common.AppJwtUtil;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.transaction.annotation.Transactional;
  15. import org.springframework.util.DigestUtils;
  16. import java.util.HashMap;
  17. import java.util.Map;
  18. @Service
  19. @Transactional
  20. @Slf4j
  21. public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {
  22. /**
  23. * app登录功能
  24. * @param dto
  25. * @return
  26. */
  27. @Override
  28. public ResponseResult login(LoginDto dto) {
  29. // 1. 正常登录 用户名和密码
  30. if(StringUtils.isNotBlank(dto.getPhone()) && StringUtils.isNotBlank(dto.getPassword())) {
  31. // 1.1 根据手机号查询用户信息
  32. ApUser dbUser = getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
  33. if(dbUser == null) {
  34. return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "用户信息不存在");
  35. }
  36. // 1.2 对比密码
  37. String salt = dbUser.getSalt();
  38. String password = dto.getPassword();
  39. String paswd = DigestUtils.md5DigestAsHex((password + salt).getBytes());
  40. if(!paswd.equals(dbUser.getPassword())) {
  41. return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
  42. }
  43. // 1.3 返回数据 jwt
  44. String token = AppJwtUtil.getToken(dbUser.getId().longValue());
  45. Map<String, Object> map = new HashMap<>();
  46. map.put("token", token);
  47. dbUser.setSalt("");
  48. dbUser.setPassword("");
  49. map.put("user", dbUser);
  50. return ResponseResult.okResult(map);
  51. } else {
  52. // 2. 游客登录
  53. Map<String, Object> map = new HashMap<>();
  54. map.put("token", AppJwtUtil.getToken(0L));
  55. return ResponseResult.okResult(map);
  56. }
  57. }
  58. }

ApUserLoginController

  1. package com.heima.user.controller.v1;
  2. import com.heima.model.common.dtos.ResponseResult;
  3. import com.heima.model.user.dtos.LoginDto;
  4. import com.heima.user.service.ApUserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.PostMapping;
  7. import org.springframework.web.bind.annotation.RequestBody;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. @RestController
  11. @RequestMapping("/api/v1/login")
  12. public class ApUserLoginController {
  13. @Autowired
  14. private ApUserService apUserService;
  15. @PostMapping("/login_auth")
  16. public ResponseResult login(@RequestBody LoginDto dto) {
  17. return apUserService.login(dto);
  18. }
  19. }

五、接口工具postman、swagger、knife4j

1. 接口工具-postman

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。Postman被500万开发者和超过100,000家公司用于每月访问1.3亿个API。

官网:https://www.postman.com/

登录请求的测试:http://localhost:51801/api/v1/login/login_auth

  1. {
  2. "phone": "13511223456",
  3. "password": "admin"
  4. }

2. 接口工具-Swagger

前后端分离开发

项目基于前后端分离的架构进行开发,前后端分离架构总体上包括前端和服务端,通常是多人协作开发。

(1)简介

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。它的主要作用是:

  • 使得前后端分离开发更加方便,有利于团队协作
  • 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担
  • 功能测试

(2)SpringBoot集成Swagger

①引入依赖

在heima-leadnews-model和heima-leadnews-common模块的pom.xml中引入该依赖

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-swagger2</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>io.springfox</groupId>
  7. <artifactId>springfox-swagger-ui</artifactId>
  8. </dependency>

②在heima-leadnews-common中进行配置(其他微服务工程都直接或间接依赖common模块)

新增com.heima.coomon.swagger.SwaggerConfiguration

  1. package com.heima.common.swagger;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import springfox.documentation.builders.ApiInfoBuilder;
  5. import springfox.documentation.builders.PathSelectors;
  6. import springfox.documentation.builders.RequestHandlerSelectors;
  7. import springfox.documentation.service.ApiInfo;
  8. import springfox.documentation.service.Contact;
  9. import springfox.documentation.spi.DocumentationType;
  10. import springfox.documentation.spring.web.plugins.Docket;
  11. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  12. @Configuration
  13. @EnableSwagger2
  14. public class SwaggerConfiguration {
  15. @Bean
  16. public Docket buildDocket() {
  17. return new Docket(DocumentationType.SWAGGER_2)
  18. .apiInfo(buildApiInfo())
  19. .select()
  20. // 要扫描的API(Controller)基础包
  21. .apis(RequestHandlerSelectors.basePackage("com.heima"))
  22. .paths(PathSelectors.any())
  23. .build();
  24. }
  25. private ApiInfo buildApiInfo() {
  26. Contact contact = new Contact("黑马程序员","","");
  27. return new ApiInfoBuilder()
  28. .title("黑马头条-平台管理API文档")
  29. .description("黑马头条后台api")
  30. .contact(contact)
  31. .version("1.0.0").build();
  32. }
  33. }

③在heima-leadnews-common模块中的resources目录下的META-INF/spring.factories中新增如下

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. com.heima.common.exception.ExceptionCatch,\
  3. com.heima.common.swagger.SwaggerConfiguration

④Swagger常用注解

注解释义
@Api修饰整个类,描述Controller的作用
@ApiOperation描述一个类的一个方法,或者说一个接口
@ApiParam单个参数的描述信息
@ApiModel用对象接收参数
@ApiModelProperty用对象接收参数时,描述对象的一个字段
@ApiResponseHTTP响应其中一个描述
@ApiResponsesHTTP响应整体描述
@ApiIgnore使用该注解忽略这个API
@ApiError发生错误返回的信息
@ApiImplicitParam一个请求参数
@ApiImplicitParams多个请求参数的描述信息

@ApiImplicitParam属性:

属性取值作用
paramType查询参数类型
path以地址的形式提交数据
query直接跟参数完成自动映射赋值
body以流的形式提交 仅支持POST
header参数在request headers 里边提交
form以form表单的形式提交 仅支持POST
dataType参数的数据类型 只作为标志说明,并没有实际验证
Long
String
name接收参数名
value接收参数的意义描述
required参数是否必填
true必填
false非必填
defaultValue默认值

在ApUserLoginController中添加Swagger注解

  1. @RestController
  2. @RequestMapping("/api/v1/login")
  3. @Api(value = "app端用户登录", tags = "app端用户登录")
  4. public class ApUserLoginController {
  5. @Autowired
  6. private ApUserService apUserService;
  7. @PostMapping("/login_auth")
  8. @ApiOperation("用户登录")
  9. public ResponseResult login(@RequestBody LoginDto dto) {
  10. return apUserService.login(dto);
  11. }
  12. }

在LoginDto添加注解

  1. package com.heima.model.user.dtos;
  2. import io.swagger.annotations.ApiModelProperty;
  3. import lombok.Data;
  4. @Data
  5. public class LoginDto {
  6. /**
  7. * 手机号
  8. */
  9. @ApiModelProperty(value = "手机号", required = true)
  10. private String phone;
  11. /**
  12. * 密码
  13. */
  14. @ApiModelProperty(value = "密码", required = true)
  15. private String password;
  16. }

⑤启动UserApplication

访问接口文档:http://localhost:51801/swagger-ui.html

3. 接口工具-knife4j

(1)简介

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-boostrap-ui,取名knife4j是希望它能像一把匕首一样小巧,并且功能强悍。

gitee地址:knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案

官方文档:Knife4j · 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j

效果演示:http://knife4j.xiaominfo.com/doc.html

(2)核心功能

  • 文档说明:根据Swagger的规范说明,详细列出接口文档的说明,包括接口地址、类型、请求示例、请求参数、响应示例、响应参数、响应码等信息,使用swagger-bootstrap-ui能根据该文档说明,对该接口的使用情况一目了然。
  • 在线调试:提供在线接口联调的强大功能,自动解析当前接口参数,同时包含表单验证,调用参数可返回接口响应内容、headers、Curl请求命令实例、响应时间、响应状态码等信息,帮助开发者在线调试,而不必通过其他测试工具测试接口是否正确,简洁、强大。
  • 个性化设置:通过个性化ui配置项,可以自定义UI的相关显示信息
  • 离线文档:根据标准规范,生成的在线markdown离线文档,开发者可以进行拷贝生成的markdown接口文档,通过其他第三方markdown转换工具转换成html或pdf,这样也可以放弃swagger2markdown组件
  • 接口排序:自1.8.5后,ui支持了接口排序功能,例如一个注册功能主要包含了多个步骤,可以根据swagger-bootstrap-ui提供的接口排序规则实现接口的排序,step化接口操作,方便其他开发者进行接口对接。

(3)快速集成

①在heima-leadnews-common模块中的pom.xml文件中引入knife4j的依赖

  1. <dependency>
  2. <groupId>com.github.xiaoymin</groupId>
  3. <artifactId>knife4j-spring-boot-starter</artifactId>
  4. </dependency>

②创建swagger配置文件

在heima-leadnews-common模块中新建配置类SwaggerConfiguration

  1. package com.heima.common.knife4j;
  2. import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.context.annotation.Import;
  6. import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
  7. import springfox.documentation.builders.ApiInfoBuilder;
  8. import springfox.documentation.builders.PathSelectors;
  9. import springfox.documentation.builders.RequestHandlerSelectors;
  10. import springfox.documentation.service.ApiInfo;
  11. import springfox.documentation.spi.DocumentationType;
  12. import springfox.documentation.spring.web.plugins.Docket;
  13. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  14. @Configuration
  15. @EnableSwagger2
  16. @EnableKnife4j
  17. @Import(BeanValidatorPluginsConfiguration.class)
  18. public class Swagger2Configuration {
  19. @Bean(value = "defaultApi2")
  20. public Docket defaultApi2() {
  21. Docket docket=new Docket(DocumentationType.SWAGGER_2)
  22. .apiInfo(apiInfo())
  23. //分组名称
  24. .groupName("1.0")
  25. .select()
  26. //这里指定Controller扫描包路径
  27. .apis(RequestHandlerSelectors.basePackage("com.heima"))
  28. .paths(PathSelectors.any())
  29. .build();
  30. return docket;
  31. }
  32. private ApiInfo apiInfo() {
  33. return new ApiInfoBuilder()
  34. .title("黑马头条API文档")
  35. .description("黑马头条API文档")
  36. .version("1.0")
  37. .build();
  38. }
  39. }
注解说明
@EnableSwagger2该注解是Springfox-swagger框架提供的使用Swagger的注解,该注解必须添加
@EnableKnife4j该注解是knife4j提供的增强注解,Ui提供了例如动态参数、参数过滤、接口排序等增强功能,如果你想使用这些增强功能就必须加该注解,否则可以不用加

③在META-INF/spring.factories中新增配置

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. com.heima.common.exception.ExceptionCatch,\
  3. com.heima.common.swagger.SwaggerConfiguration,\
  4. com.heima.common.swagger.Swagger2Configuration

④启动UserApplication

访问地址:http://localhost:51801/doc.html#/home

六、app端网关

1. app端网关

(1)网关概述

实现步骤:

①在heima-leadnews-gateway导入以下依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-gateway</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba.cloud</groupId>
  8. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.alibaba.cloud</groupId>
  12. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>io.jsonwebtoken</groupId>
  16. <artifactId>jjwt</artifactId>
  17. </dependency>
  18. </dependencies>

②在heima-leadnews-gateway下创建heima-leadnews-app-gateway微服务

新增引导类AppGatewayApplication

  1. package com.heima.app.gateway;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @SpringBootApplication
  6. @EnableDiscoveryClient //开启注册中心
  7. public class AppGatewayApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(AppGatewayApplication.class,args);
  10. }
  11. }

新增配置类bootstrap.yml

  1. server:
  2. port: 51601
  3. spring:
  4. application:
  5. name: leadnews-app-gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 192.168.200.130:8848
  10. config:
  11. server-addr: 192.168.200.130:8848
  12. file-extension: yml

③在nacos添加Data ID为leadnews-app-gateway的配置文件

  1. spring:
  2. cloud:
  3. gateway:
  4. globalcors:
  5. add-to-simple-url-handler-mapping: true
  6. corsConfigurations:
  7. '[/**]':
  8. allowedHeaders: "*"
  9. allowedOrigins: "*"
  10. allowedMethods:
  11. - GET
  12. - POST
  13. - DELETE
  14. - PUT
  15. - OPTION
  16. routes:
  17. # 平台管理
  18. - id: user
  19. uri: lb://leadnews-user
  20. predicates:
  21. - Path=/user/**
  22. filters:
  23. - StripPrefix= 1

④启动AppGatewayApplication和UserApplication

网址:http://localhost:51601/user/api/v1/login/login_auth

2. 认证过滤器

实现步骤:

①拷贝一份jwt解析工具类AppJwtUtil到网关微服务中

②在网关微服务中新建全局过滤器

  1. package com.heima.app.gateway.filter;
  2. import com.heima.app.gateway.util.AppJwtUtil;
  3. import io.jsonwebtoken.Claims;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.commons.lang.StringUtils;
  6. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  7. import org.springframework.cloud.gateway.filter.GlobalFilter;
  8. import org.springframework.core.Ordered;
  9. import org.springframework.http.HttpStatus;
  10. import org.springframework.http.server.reactive.ServerHttpRequest;
  11. import org.springframework.http.server.reactive.ServerHttpResponse;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.web.server.ServerWebExchange;
  14. import reactor.core.publisher.Mono;
  15. @Component
  16. @Slf4j
  17. public class AuthorizeFilter implements Ordered, GlobalFilter {
  18. @Override
  19. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  20. // 1. 获取request和response对象
  21. ServerHttpRequest request = exchange.getRequest();
  22. ServerHttpResponse response = exchange.getResponse();
  23. // 2. 判断是否是登录
  24. if(request.getURI().getPath().contains("/login")) {
  25. // 放行
  26. return chain.filter(exchange);
  27. }
  28. // 3. 获取token
  29. String token = request.getHeaders().getFirst("token");
  30. // 4. 判断token是否存在
  31. if(StringUtils.isBlank(token)) {
  32. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  33. return response.setComplete();
  34. }
  35. // 5. 判断token是否有效
  36. try {
  37. Claims claimsBody = AppJwtUtil.getClaimsBody(token);
  38. // 判断token是否过期
  39. int result = AppJwtUtil.verifyToken(claimsBody);
  40. if (result == 1 || result == 2) {
  41. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  42. return response.setComplete();
  43. }
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  47. return response.setComplete();
  48. }
  49. // 6. 放行
  50. return chain.filter(exchange);
  51. }
  52. /**
  53. * 优先级设置:值越小,优先级越高
  54. * @return
  55. */
  56. @Override
  57. public int getOrder() {
  58. return 0;
  59. }
  60. }

③重启AppGatewayApplication和UserApplication

如果访问其他微服务,会提示需要认证才能访问,这个时候就需要在headers中设置token才能正常访问。

七、app前端项目集成

①解压nginx-1.18.0.zip和app-web.zip到一个不带中文的路径下

②启动nginx

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)

如果有出现上面的问题,可以查看正在占用80端口的程序,并kill掉

或者在nginx.conf把监听端口改成其他的,如8080

③在niginx安装的conf目录下新建一个文件夹leadnews.conf,在当前文件夹中新建heima-leadnews-app.conf文档,配置如下:(根据自己的情况修改前端工程路径

  1. upstream heima-app-gateway{
  2. server localhost:51601;
  3. }
  4. server {
  5. listen 8801;
  6. location / {
  7. root D:/IDEA/frontProject/app-web/;
  8. index index.html;
  9. }
  10. location ~/app/(.*) {
  11. proxy_pass http://heima-app-gateway/$1;
  12. proxy_set_header HOST $host; # 不改变源请求头的值
  13. proxy_pass_request_body on; #开启获取请求体
  14. proxy_pass_request_headers on; #开启获取请求头
  15. proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP
  16. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息
  17. }
  18. }

④把nginx.conf里面的内容覆盖为如下,引入heima-leadnews-app.conf文件加载

  1. #user nobody;
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. sendfile on;
  10. keepalive_timeout 65;
  11. # 引入自定义配置文件
  12. include leadnews.conf/*.conf;
  13. }

⑤启动niginx,在nginx安装包中使用命令提示符打开,输入nignx启动项目

可查看进行,检查nginx是否启动。

重新加载配置文件:nginx -s reload

⑥启动UserApplication和AppGatewayApplication

访问:http://localhost:8801/

注意,要先启动nacos

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号