来开始搭建springCloud的客户端client服务。
首先,也是从在线生成了springboot项目。
在线网址:start.spring.io/
下载下来的是一个压缩包,解压之后,用编译器IDEA打开这个服务。
因为,我是一次性搭建了spingCloud+eureka+swagger+mybatisPlus,所以这次的话,我就一次性给大家展示一下。也由于这次的话,不仅仅是局限于这三个配置文件,我还要新增一些配置文件,所以我先把已经搭建成功了的服务的目录给大家看一下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入mybatis依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> <!--引入mybatisPlus依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.5</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.1.8</version> </dependency> <!-- 模板引擎 代码生成 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> <!-- mysql驱动器依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!--springboot的web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Herbnate实体依赖--> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0.2</version> </dependency> <!-- redis依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!-- 引入Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!--springCloud启动依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <!--srpingCloud的eureka服务依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!--srpingCloud的eureka服务注册依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>2.0.0.RELEASE</version> </dependency> <!--新增依赖,swaggerUI--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.7.0</version> </dependency> <!-- alibaba fastjson 格式化对 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> <!-- jwt认证协议依赖 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-javanica</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies> <!-- 引入spring cloud的依赖,不能少,主要用来管理Spring Cloud生态各组件的版本 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <!--需要打包的目录--> <directory>src/main/resources</directory> <!--目录中的文件类型--> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> 复制代码
这个pom文件里面,还有redis的依赖,这个是我后续会加进去的,但是现阶段还没有加进去。
#服务名 spring.application.name=permission #端口 server.port=2222 ################################################################################################################ #数据库信息 spring.datasource.url: jdbc:mysql://localhost:3306/myblog?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username: root spring.datasource.password: 123456(请填入你的数据库密码) spring.datasource.driver-class-name: com.mysql.jdbc.Driver ################################################################################################################# spring.jmx.default-domain=${spring.application.name} spring.jpa.open-in-view=false # springframework.web日志以DEBUG级别输出 logging.level.org.springframework.web=info ############################################################################################################### # 如果是放在src/main/java目录下 classpath:/com/blog/*/mapper/*Mapper.xml # 如果是放在resource目录 classpath:/mapper/*Mapper.xml mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml #实体扫描,多个package用逗号或者分号分隔 mybatis-plus.type-aliases-package=com.blog.*.entity #驼峰下划线转换 mybatis-plus.global-config.db-column-underline=true #刷新mapper 调试神器 mybatis-plus.global-config.refresh-mapper=false #数据库大写下划线转换 mybatis-plus.global-config.capital-mode=true ################################################################################################################# #配置Swagger相关信息(从eureka跳到swagger页面) eureka.instance.prefer-ip-address=true eureka.instance.hostname=:${spring.cloud.client.ipAddress} eureka.instance.status-page-url:http://${spring.cloud.client.ipAddress}:${server.port}/swagger-ui.html #################################################################################################################### #eureka注册中心路径 eureka.client.service-url.defaultZone=http://localhost:1111/eureka/ #表示本服务发送给eureka服务端的心跳时间 eureka.instance.leaseRenewalIntervalInSeconds: 10 #当本服务掉线后,eureka服务端取掉本服务的缓存的时间 eureka.instance.leaseExpirationDurationInSeconds: 2 #注册到eureka上的服务的名字 eureka.instance.instance-id=http://${spring.cloud.client.ipAddress}:${server.port}/${spring.application.name} ####################################################################################################################### #逻辑删除配置(下面3个配置),不是真实删除数据,只是逻辑删除数据 mybatis-plus.global-config.logic-delete-value=1 mybatis-plus.global-config.logic-not-delete-value=0 mybatis-plus.global-config.sql-injector=com.baomidou.mybatisplus.mapper.LogicSqlInjector ############################################################################################################## mybatis-plus.global-config.meta-object-handler=com.blog.permission.mabatisPlus.MyMetaObjectHandler mybatis-plus.configuration.map-underscore-to-camel-case=true mybatis-plus.configuration.cache-enabled=false mybatis-plus.configuration.jdbc-type-for-null=null mybatis-plus.typeAliasesPackage=com.blog.permission.entity mybatis-plus.global-config.id-type=3 mybatis-plus.global-config.field-strategy=2 mybatis-plus.global-config.key-generator=com.baomidou.mybatisplus.incrementer.OracleKeyGenerator 复制代码
图片:
代码:
@EnableWebSecurity @SpringCloudApplication @EnableTransactionManagement @EnableFeignClients @ComponentScan(basePackages = "com.blog.permission") @EnableAsync @EnableScheduling @EnableSwagger2 @EnableWebMvc public class PermissionApplication { public static void main(String[] args) { SpringApplication.run(PermissionApplication.class, args);; } } 复制代码
接下来,要开始新增配置文件了。
@Configuration @EnableSwagger2 public class Swagger2 { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.blog.permission.controller")) .paths(Predicates.not(PathSelectors.regex("/error.*")))//错误路径不监控 .paths(PathSelectors.regex("/.*"))// 对根下所有路径进行监控 .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() //页面标题 .title("登录以及权限管理20190926") //描述 .description("项目API文档") //创建人 .contact("就是作者我") //版本号 .version("1.0") .build(); } } 复制代码
@Configuration @EnableWebMvc class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } //设置swagger里面返回的responsebody的值为json字符串 @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters){ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); List<MediaType> list=new ArrayList<MediaType>(); list.add(MediaType.APPLICATION_JSON_UTF8); list.add(new MediaType("text","html", Charset.forName("UTF-8"))); list.add(new MediaType("application","*+json",Charset.forName("UTF-8"))); converter.setSupportedMediaTypes(list); converters.add(converter); } } 复制代码
@EnableTransactionManagement @Configuration @MapperScan("com.blog.*.mapper") public class MybatisPlusConfig { /** * mybatis-plus SQL执行效率插件【生产环境可以关闭】 */ @Bean public PerformanceInterceptor performanceInterceptor() { return new PerformanceInterceptor(); } /* * 分页插件,自动识别数据库类型 多租户,请参考官网【插件扩展】 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } @Bean public MetaObjectHandler metaObjectHandler() { return new MyMetaObjectHandler(); } /** * 注入主键生成器 */ @Bean public IKeyGenerator keyGenerator() { return new H2KeyGenerator(); } /** * 注入sql注入器 */ @Bean public ISqlInjector sqlInjector() { return new LogicSqlInjector(); } } 复制代码
public class MybatisPlusSql implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> { private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class); private Resource configLocation; private Configuration configuration; private Resource[] mapperLocations; private DataSource dataSource; private TransactionFactory transactionFactory; private Properties configurationProperties; private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); private SqlSessionFactory sqlSessionFactory; private String environment = SqlSessionFactoryBean.class.getSimpleName(); private boolean failFast; private Interceptor[] plugins; private TypeHandler<?>[] typeHandlers; private String typeHandlersPackage; private Class<?>[] typeAliases; private String typeAliasesPackage; private Class<?> typeAliasesSuperType; private DatabaseIdProvider databaseIdProvider; private Class<? extends VFS> vfs; private Cache cache; private ObjectFactory objectFactory; private ObjectWrapperFactory objectWrapperFactory; @Override public SqlSessionFactory getObject() throws Exception { return null; } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { return false; } @Override public void afterPropertiesSet() throws Exception { } @Override public void onApplicationEvent(ApplicationEvent applicationEvent) { } } 复制代码
@Component public class MyMetaObjectHandler extends MetaObjectHandler { protected final static Logger logger = LoggerFactory.getLogger(Application.class); @Override public void insertFill(MetaObject metaObject) { logger.info("新增数据库:"); } @Override public void updateFill(MetaObject metaObject) { logger.info("修改数据库:"); } } 复制代码
因为要避免一些启动的时候爆出的一些错误,我还新建了一个空白的config.properties文件,里面什么都没有。
好的,配置文件基本上已经妥了,但是如果这个时候启动服务,依然会报错,因为你没有配套的controller,serivice,mapper等等文件。
因此,我创建了一个实体类,用来专门生成代码。
@Component public class CreateCodeMethod {
/** * * @Title: main * @Description: 生成 * @param args */ public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); gc.setOutputDir("D://"); //输出文件路径 gc.setFileOverride(true); gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false gc.setEnableCache(false);// XML 二级缓存 gc.setBaseResultMap(true);// XML ResultMap gc.setBaseColumnList(false);// XML columList gc.setAuthor("wuchong");// 作者 // 自定义文件命名,注意 %s 会自动填充表实体属性! gc.setControllerName("%sController"); gc.setServiceName("%sService"); gc.setServiceImplName("%sServiceImpl"); gc.setMapperName("%sMapper"); gc.setXmlName("%sMapper"); mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setDbType(DbType.MYSQL); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("123456"); dsc.setUrl("jdbc:mysql://localhost:3306/myblog"); mpg.setDataSource(dsc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); // strategy.setTablePrefix(new String[] { "sys_" });// 此处可以修改为您的表前缀 strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略 strategy.setInclude(new String[] { "permission","permission_manage","user"}); // 需要生成的表 strategy.setLogicDeleteFieldName("record_status");//设置逻辑删除的字段 strategy.setSuperServiceClass(null); strategy.setEntityLombokModel(true); strategy.setSuperServiceImplClass(null); strategy.setSuperMapperClass(null); mpg.setStrategy(strategy); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent("blog"); pc.setController("controller"); pc.setService("service"); pc.setServiceImpl("service.impl"); pc.setMapper("mapper"); pc.setEntity("entity"); pc.setXml("xml"); mpg.setPackageInfo(pc); // 执行生成 mpg.execute(); } } 复制代码
这里必须要讲一下我的表结构了,以我mysql的表结构为例子:
可以看到,我的数据库的表user中有一个字段record_status,这个字段是我机会用来做逻辑删除的,相信经常开发业务的小伙伴知道,一般的表数据不会真的物理删除,只会进行逻辑删除,而mybatisPlus的可以简单的封装这个逻辑删除,当你在使用代码生成器的时候,请注意我在下面的截图:
我框起来的一段代码,是为了保证你在生成实体类的时候,这个record_status字段有着特定的一个注解: @TableLogic有了这个注解,你在调用mybatisPlus的删除方法的时候,它就会逻辑删除你的数据了。
好的,生成的各个java文件,我是配置到了D盘的blog文件夹中,取出来,放到项目中。
如图所示:
controller文件:
service文件:
ServiceImpl文件:
mapper文件:
mapper.xml文件:
这个时候,可以开始启动服务了。
打开网页,输入网址:localhost:1111( ps:这个eureka服务端是上一篇文章建立的,先讲eureka服务端启动,再来启动我们刚刚创建的eureka客户端 )
可以看到,我们的服务已经注册到eureka上去了。
点击: http://192.168.1.5:2222/permission,可以进入到swagger页面,如下图所示
可以测试一下了我们配置的东西是否完善可行了。
我搭建的这个eureka客户端,实际上是可以满足单纯只是自己玩一玩的开发需求了。
需要注意的地方是,你可以按照你自己的爱好来创建文件,但是一定要注意配置文件,你比如说,在application.properties文件中有这么一个配置:
这个配置对应的文件,是我创建的一个配置文件 MyMetaObjectHandler.java 所在的地方.
因此,当你准备开始搭建自己的springCloud的时候,一定要注意所有的配置文件,你理所应当的把所有的配置文件看一遍,最好是按照我的文章完全一样的搭建一次,然后再按照你的思路来玩才能没问题。