写这篇文章的主要目的是记录自己学习全栈开发和开发过程中的一些记录,至于为什么学习全栈,最直接的目的就是方便自己接点私活【手动滑稽】,万事不求人吗。顺便也学习些新技术,记录下各种踩坑的地方。
一、项目架构
1、使用eureka做为微服务认证注册服务器,使用集群保证认证注册服务器高可用
2、使用gateway做为网关路由,gateway内部集成负载均衡,无需过多考虑服务负载问题
3、使用Oauth2做为权限认证和验证中心,同时扩展自定义认证方式和类session形式自动延长token有效期,满足复杂的认证模式
4、log服务为日志系统,监控rabbitmq消息,将日志信息存入数据库。业务系统使用自定义注解,自动获取访问方法和参数等重要数据,通过rabbitmq发送。
5、sys提供系统管理相关数据接口,主要为用户、角色、权限等信息,为其他业务提供数据支撑
6、util为公共工具类,其他服务引入该服务,同时提供公共model,保证任务之间数据格式的统一性
二、搭建父工程
为保证各微服务之间版本统一和方便打包,使用父工程将共用jar包和版本号进行统一管理,maven配置如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.land</groupId>
<artifactId>longmao</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<name>longmao</name>
<description>主maven配置,主要为方便打包和版本控制</description>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modules>
<module>eureka</module>
<module>oauth</module>
<module>sys</module>
<module>log</module>
<module>util</module>
<module>gateway</module>
</modules>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencies>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
三、搭建eureka服务
首先在pom文件中引入eureka服务端jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在启动类添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
配置
server:
port: 8761
spring:
application:
name: eureka
eureka:
instance:
prefer-ip-address: true
hostname: 127.0.0.1
client:
# 配置高可用时,需要将下面两个配置改为true,单机时最好设置为false
register-with-eureka: false
fetch-registry: false
serviceUrl:
defaultZone: http://${
eureka.instance.hostname}:${
server.port}/eureka/
可为eureka服务配置账号密码,需要引入security的jar包,并配置账号和密码,本平台因采用网络隔离的方式进行部署,只有gateway服务面向互联网开放,所以暂时不需要
四、搭建路由服务
1、引入gateway和eureka客户端jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、配置文件如下
server:
port: 8080
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
eureka:
client:
service-url:
dafaultZone: http://localhost:8761/eureka
registry-fetch-interval-seconds: 5
instance:
health-check-url-path: /actuator/health
lease-renewal-interval-in-seconds: 10
这里修改了服务刷新时间和心跳时间,主要是为了处理业务服务器重启导致路由长时间不能解析到地址的问题
3、跨域处理
新建CorsConfig配置文件,代码如下
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
这里的配置比较简单粗暴,可以根据实际情况进行调整
4、在启动类上添加eureka客户端注解
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
五、总结
eureka和gateway的搭建和配置比较简单,相关的文章网上一抓一大把,坑已经被踩的和填的差不多了,这里就不在详细说明了