Code Monkey home page Code Monkey logo

mycloud's Introduction

MyCloud Project

This is a cloud services hub, including services created by every idea.

所有有价值的创意都会集成在这个项目框架下进行孵化

项目构成

前端

后端

端口范围记录

user: 8080-8089

mail: 8090-8099

gateway: 8100-8109

项目功能与技术

后端

用户登录注册重置密码等基础功能

  • 基于 SpringCloud & SpringCloudAlibaba 做基础架构的微服务项目
  • 采用 Nacos 集群做注册中心,方便高效
  • 采用基于 Webflux 的 Spring Cloud Gateway 做服务网关,统一访问管理
  • 采用新一代的 HttpClient 做 RPC 调用
  • 采用 SpringSecurity 做权限校验框架,手动整合 jwt 方案做鉴权处理
  • 采用 Mybatis-Plus 做 ORM 框架,使用便捷
  • 采用 Redisson 做分布式锁
  • 采用 Redis 集群存储注册/重置密码的邮箱验证码
  • 采用 Kafka 集群存储邮件发送任务,再由监听器消费
  • 采用 Nginx 做反向代理和流量控制,提高接口安全性
  • 使用 AOP 做全局异常处理和统一接口返回值
  • 针对多环境进行处理,不同环境使用不同配置文件
  • 模块化项目功能,提高内聚性
  • 引入 Docker 容器化部署,屏蔽平台差异
  • 引入 Jenkins 做 CD/CI,流程化管控部署

前端

用户登录注册重置密码等基础功能相关页面

  • 采用 Vue3 开发
  • 采用 Element Plus 做 UI 组件库
  • 采用 Vue-Router 做路由管理
  • 采用 Axios 做异步请求框架
  • 采用 Vuex 做全局变量管理
  • 页面样式采用响应式设计,适配手机竖屏,平板和电脑

部分功能逻辑时序

注册

sequenceDiagram
mycloud-frontend ->> user 模块 : 注册请求
user 模块 ->> + MySQL : 查询用户
MySQL -->> - user 模块 : 用户未注册
user 模块 ->> Redis 集群 : 生成并存储验证码
user 模块 ->> Kafka 集群 : 生产一个邮件任务到消息队列
user 模块 -->> + mycloud-frontend : 返回验证码邮件已发送的提示

Kafka 集群 -x mail 模块 : 消费一个邮件任务消息
mail 模块 ->> mail 模块 : 发送验证码邮件

mycloud-frontend ->> - user 模块 : 带验证码的注册表单
user 模块 ->> + Redis 集群 : 获取验证码
Redis 集群 -->> - user 模块 : 返回验证码
user 模块 ->> user 模块 : 验证码校验与表单校验
user 模块 ->> + MySQL : 校验通过创建新用户
MySQL -->> - user 模块 : 创建完成
user 模块 -->> + mycloud-frontend : 返回用户注册成功的提示
Loading

重置密码

同注册

mycloud's People

Contributors

lookoutldz avatar

Watchers

 avatar

mycloud's Issues

[FileNotFoundException] FeignClientsConfiguration$MicrometerConfiguration.class

IDEA 运行&访问正常,mvn package 部署正常,访问异常

一眼 FileNotFoundException

Caused by: java.io.FileNotFoundException: class path resource [org/springframework/cloud/openfeign/FeignClientsConfiguration$MicrometerConfiguration.class] cannot be opened because it does not exist

实验所用 Mavne 依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <version>3.0.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>4.0.3</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

尝试过 spring-boot-starter-webflux:3.0.x + spring-cloud-starter-openfeign:4.0.x 的几个组合。

spring-boot-starter-webflux 换成 spring-boot-starter-web 则正常。

异常日志

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.looko.mycloud.gateway.feignclient.UserAuthFeignClient': Unexpected exception during bean creation
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:533)
	Suppressed: The stacktrace has been enhanced by Reactor, refer to additional information below:
Error has been observed at the following site(s):
	*__checkpoint ⇢ org.springframework.security.web.server.authentication.AuthenticationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.web.cors.reactive.CorsWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.looko.mycloud.gateway.filter.LogRequestPathFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ HTTP POST "/login" [ExceptionHandlingWebHandler]
Original Stack Trace:
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:533)
		at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
		at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
		at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
		at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
		at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
		at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417)
		at org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver$1.getTarget(ContextAnnotationAutowireCandidateResolver.java:107)
		at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:203)
		at jdk.proxy2/jdk.proxy2.$Proxy83.getUserByUsernameOrEmail(Unknown Source)
		at org.looko.mycloud.gateway.service.AuthorizationService.lambda$findByUsername$0(AuthorizationService.java:34)
		at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
		at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
		at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
		at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
		at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
		at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
		at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [org.springframework.cloud.openfeign.FeignClientsConfiguration]
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:178)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:415)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:287)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:344)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:115)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:771)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:589)
	at org.springframework.cloud.context.named.NamedContextFactory.createContext(NamedContextFactory.java:138)
	at org.springframework.cloud.context.named.NamedContextFactory.getContext(NamedContextFactory.java:122)
	at org.springframework.cloud.context.named.NamedContextFactory.getInstance(NamedContextFactory.java:197)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.get(FeignClientFactoryBean.java:363)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.feign(FeignClientFactoryBean.java:134)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:433)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:421)
	at org.springframework.cloud.openfeign.FeignClientsRegistrar.lambda$lazilyRegisterFeignClientBeanDefinition$0(FeignClientsRegistrar.java:288)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainInstanceFromSupplier(AbstractAutowireCapableBeanFactory.java:1254)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:949)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1214)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1158)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417)
	at org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver$1.getTarget(ContextAnnotationAutowireCandidateResolver.java:107)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:203)
	at jdk.proxy2/jdk.proxy2.$Proxy83.getUserByUsernameOrEmail(Unknown Source)
	at org.looko.mycloud.gateway.service.AuthorizationService.lambda$findByUsername$0(AuthorizationService.java:34)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.io.FileNotFoundException: class path resource [org/springframework/cloud/openfeign/FeignClientsConfiguration$MicrometerConfiguration.class] cannot be opened because it does not exist
	at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:211)
	at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:54)
	at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48)
	at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103)
	at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:122)
	at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:81)
	at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:610)
	at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:579)
	at org.springframework.context.annotation.ConfigurationClassParser$SourceClass.getMemberClasses(ConfigurationClassParser.java:889)
	at org.springframework.context.annotation.ConfigurationClassParser.processMemberClasses(ConfigurationClassParser.java:348)
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:265)
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:243)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:196)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:164)
	... 37 more
	

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.