提交 15ea9735 编写于 作者: 112Lst's avatar 112Lst

【add】feign整合

上级 c344d3b6
......@@ -2,6 +2,7 @@
<module version="4">
<component name="AdditionalModuleElements">
<content url="file://$MODULE_DIR$/club-auth" dumb="true">
<sourceFolder url="file://$MODULE_DIR$/club-auth/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/club-auth/src/main/resources" type="java-resource" />
</content>
</component>
......
......@@ -11,5 +11,28 @@
<artifactId>club-auth-api</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.lssst;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
\ No newline at end of file
package com.lssst.auth.api;
import com.lssst.auth.entity.AuthUserDTO;
import com.lssst.auth.entity.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 用户服务feign
*/
@FeignClient("jc-club-auth-dev")
public interface UserFeignService {
@RequestMapping("/user/getUserInfo")
Result<AuthUserDTO> getUserInfo(@RequestBody AuthUserDTO authUserDTO);
}
package com.lssst.auth.application.dto;
package com.lssst.auth.entity;
import lombok.Data;
......@@ -9,6 +8,7 @@ import java.util.Date;
/**
* 用戶信息dto
*/
@Data
public class AuthUserDTO implements Serializable {
......@@ -34,5 +34,5 @@ public class AuthUserDTO implements Serializable {
private String extJson;
}
}
package com.lssst.auth.common.entity;
package com.lssst.auth.entity;
import com.lssst.auth.common.enums.ResultCodeEnum;
import lombok.Data;
@Data
......@@ -48,5 +47,5 @@ public class Result<T> {
return result;
}
}
package com.lssst.auth.common.enums;
package com.lssst.auth.entity;
import lombok.Getter;
......@@ -12,7 +12,7 @@ public enum ResultCodeEnum {
public String desc;
ResultCodeEnum(int code, String desc){
ResultCodeEnum(int code,String desc){
this.code = code;
this.desc = desc;
}
......@@ -27,3 +27,4 @@ public enum ResultCodeEnum {
}
}
......@@ -34,6 +34,11 @@
<artifactId>club-auth-domain</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lssst</groupId>
<artifactId>club-auth-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
......
package com.lssst.auth.application.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.lssst.auth.application.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
/**
* mvc的全局处理
*
* @author: ChickenWing
* @date: 2023/10/7
*/
@Configuration
public class GlobalConfig extends WebMvcConfigurationSupport {
......@@ -23,6 +27,12 @@ public class GlobalConfig extends WebMvcConfigurationSupport {
converters.add(mappingJackson2HttpMessageConverter());
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**");
}
/**
* 自定义mappingJackson2HttpMessageConverter
* 目前实现:空值忽略,空字段可返回
......@@ -36,4 +46,3 @@ public class GlobalConfig extends WebMvcConfigurationSupport {
}
package com.lssst.auth.application.context;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
/**
* 登录上下文对象
*/
public class LoginContextHolder {
private static final InheritableThreadLocal<Map<String, Object>> THREAD_LOCAL
= new InheritableThreadLocal<>();
public static void set(String key, Object val) {
Map<String, Object> map = getThreadLocalMap();
map.put(key, val);
}
public static Object get(String key){
Map<String, Object> threadLocalMap = getThreadLocalMap();
return threadLocalMap.get(key);
}
public static String getLoginId(){
return (String) getThreadLocalMap().get("loginId");
}
public static void remove(){
THREAD_LOCAL.remove();
}
public static Map<String, Object> getThreadLocalMap() {
Map<String, Object> map = THREAD_LOCAL.get();
if (Objects.isNull(map)) {
map = new ConcurrentHashMap<>();
THREAD_LOCAL.set(map);
}
return map;
}
}
......@@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.lssst.auth.application.convert.AuthPermissionDTOConverter;
import com.lssst.auth.application.dto.AuthPermissionDTO;
import com.lssst.auth.common.entity.Result;
import com.lssst.auth.entity.Result;
import com.lssst.auth.domain.entity.AuthPermissionBO;
import com.lssst.auth.domain.service.AuthPermissionDomainService;
import lombok.extern.slf4j.Slf4j;
......@@ -96,7 +96,5 @@ public class PermissionController {
}
}
}
......@@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.lssst.auth.application.convert.AuthRoleDTOConverter;
import com.lssst.auth.application.dto.AuthRoleDTO;
import com.lssst.auth.common.entity.Result;
import com.lssst.auth.entity.Result;
import com.lssst.auth.domain.entity.AuthRoleBO;
import com.lssst.auth.domain.service.AuthRoleDomainService;
import lombok.extern.slf4j.Slf4j;
......
......@@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.lssst.auth.application.convert.AuthRolePermissionDTOConverter;
import com.lssst.auth.application.dto.AuthRolePermissionDTO;
import com.lssst.auth.common.entity.Result;
import com.lssst.auth.entity.Result;
import com.lssst.auth.domain.entity.AuthRolePermissionBO;
import com.lssst.auth.domain.service.AuthRolePermissionDomainService;
import lombok.extern.slf4j.Slf4j;
......
......@@ -3,12 +3,11 @@ package com.lssst.auth.application.controller;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.lssst.auth.application.convert.AuthUserDTOConverter;
import com.lssst.auth.application.dto.AuthUserDTO;
import com.lssst.auth.common.entity.Result;
import com.lssst.auth.entity.AuthUserDTO;
import com.lssst.auth.entity.Result;
import com.lssst.auth.domain.entity.AuthUserBO;
import com.lssst.auth.domain.service.AuthUserDomainService;
import lombok.extern.slf4j.Slf4j;
......
package com.lssst.auth.application.convert;
import com.lssst.auth.application.dto.AuthUserDTO;
import com.lssst.auth.domain.entity.AuthUserBO;
import com.lssst.auth.entity.AuthUserDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 用户dto转换器
*/
......
package com.lssst.auth.application.interceptor;
import com.lssst.auth.application.context.LoginContextHolder;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 登录拦截器
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String loginId = request.getHeader("loginId");
LoginContextHolder.set("loginId", loginId);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
LoginContextHolder.remove();
}
}
spring:
application:
name: jc-club-auth
name: jc-club-auth-dev
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 117.0.0.1:8848
server-addr: 117.72.14.166:8848
prefix: ${spring.application.name}
group: DEFAULT_GROUP
namespace:
file-extension: yaml
discovery:
enabled: true
server-addr: 117.0.0.1:8848
server-addr: 117.72.14.166:8848
package com.lssst;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
\ No newline at end of file
spring:
application:
name: club-auth
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 117.72.14.166:8848
prefix: ${spring.application.name}
group: DEFAULT_GROUP
namespace:
file-extension: yaml
discovery:
enabled: true
server-addr: 117.72.14.166:8848
server:
port: 3011
spring:
datasource:
username: root
password: a7AyK+bHqhuxB5vMj2XppGw4tFrfRZZI7+EPWLLTg8f+uNxo+90i7MWfgyzfkmErlo/neYV+KwBJfsCLUqhwSg==
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://117.72.14.166:3306/jc-club?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 20
min-idle: 20
connectionProperties: config.decrypt=true;config.decrypt.key=${publicKey};
max-active: 100
max-wait: 60000
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: 123456
filter:
stat:
enabled: true
slow-sql-millis: 2000
log-slow-sql: true
wall:
enabled: true
config:
enabled: true
redis:
# Redis数据库索引(默认为0)
database: 1
# Redis服务器地址
host: 117.72.14.166
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password: jichi1234
# 连接超时时间
timeout: 2s
lettuce:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMJzo9TiSuOGAMR2Zma25lWdtR1oxq6RcZYnWE9vcYLNKxUOkBlvSfMrbS25KtlJi+hIzikfCoyTDB0VI5gB3Q8CAwEAAQ==
logging:
config: classpath:log4j2-spring.xml
sa-token:
# token 名称(同时也是 cookie 名称)
token-name: satoken
# token 有效期(单位:秒) 默认30天,-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
is-share: true
# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
token-style: random-32
# 是否输出操作日志
is-log: true
token-prefix: jichi
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="INFO" monitorInterval="5">
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--变量配置-->
<Properties>
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} %X{PFTID} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定义日志存储的路径 -->
<property name="FILE_PATH" value="../log" />
<property name="FILE_NAME" value="jcClub.log" />
</Properties>
<!--https://logging.apache.org/log4j/2.x/manual/appenders.html-->
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
<File name="fileLog" fileName="${FILE_PATH}/temp.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="fileLog"/>
</root>
</loggers>
</configuration>
......@@ -5,19 +5,19 @@ spring:
gateway:
routes:
- id: oss
uri: lb://jc-club-oss
uri: lb://jc-club-oss-dev
predicates:
- Path=/oss/**
filters:
- StripPrefix=1
- id: auth
uri: lb://jc-club-auth
uri: lb://jc-club-auth-dev
predicates:
- Path=/auth/**
filters:
- StripPrefix=1
- id: subject
uri: lb://jc-club-subject
uri: lb://jc-club-subject-dev
predicates:
- Path=/subject/**
filters:
......@@ -59,4 +59,3 @@ sa-token:
# 是否输出操作日志
is-log: true
token-prefix: jichi
spring:
application:
name: jc-club-gateway
name: jc-club-gateway-dev
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 117.0.0.1:8848
server-addr: 117.72.14.166:8848
prefix: ${spring.application.name}
group: DEFAULT_GROUP
namespace:
file-extension: yaml
discovery:
enabled: true
server-addr: 117.0.0.1:8848
server-addr: 117.72.14.166:8848
package com.lssst.subject.application.interceptor;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfiguration {
@Bean
public RequestInterceptor requestInterceptor(){
return new FeignRequestInterceptor();
}
}
package com.lssst.subject.application.interceptor;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
/**
* Feign请求拦截器
*
* @author: ChickenWing
* @date: 2023/12/3
*/
@Component
public class FeignRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
if (Objects.nonNull(request)) {
String loginId = request.getHeader("loginId");
if (StringUtils.isNotBlank(loginId)) {
requestTemplate.header("loginId", loginId);
}
}
}
}
......@@ -63,6 +63,12 @@
<artifactId>club-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lssst</groupId>
<artifactId>club-auth-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.lssst.subject.infra.entity;
import lombok.Data;
@Data
public class UserInfo {
private String userName;
private String nickName;
}
package com.lssst.subject.infra.rpc;
import com.lssst.auth.api.UserFeignService;
import com.lssst.auth.entity.AuthUserDTO;
import com.lssst.auth.entity.Result;
import com.lssst.subject.infra.entity.UserInfo;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class UserRpc {
@Resource
private UserFeignService userFeignService;
public UserInfo getUserInfo(String userName) {
AuthUserDTO authUserDTO = new AuthUserDTO();
authUserDTO.setUserName(userName);
Result<AuthUserDTO> result = userFeignService.getUserInfo(authUserDTO);
UserInfo userInfo = new UserInfo();
if (!result.getSuccess()) {
return userInfo;
}
AuthUserDTO data = result.getData();
userInfo.setUserName(data.getUserName());
userInfo.setNickName(data.getNickName());
return userInfo;
}
}
......@@ -3,6 +3,7 @@ package com.lssst.subject;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
/**
......@@ -14,6 +15,7 @@ import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan("com.lssst")
@MapperScan("com.lssst.**.mapper")
@EnableFeignClients(basePackages = "com.lssst")
public class SubjectApplication {
public static void main(String[] args) {
......
spring:
application:
name: jc-club-subject
name: jc-club-subject-dev
profiles:
active: dev
cloud:
......@@ -13,4 +13,4 @@ spring:
file-extension: yaml
discovery:
enabled: true
server-addr: 117.0.0.1:8848
server-addr: 117.72.14.166:8848
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册