當咱們從SpringBoot1.0過渡到 2.0的時候,可能會遇到各類各樣的問題,好比我集成的時候遇到過版本衝突,打包錯誤,eureka註冊不上去,以及沒法啓動等問題,所以我寫了一片博客記錄下來。我這裏採用的是SpringBoot2.0.2版本。css
1.先搭建一個項目eureka-server eureka的註冊與發現(這裏不過多描述) html
主要變化:引入jar包改變java
1.0版本eureka引用的jar包mysql
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
2.0版本eureka引用的jar包git
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
詳細代碼訪問個人github:https://github.com/ningcs/stocks/tree/master/config-servergithub
2 先搭建一個web項目stocks-bonusweb
2.1 集成freemark spring
① 引入freemark jar包sql
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
② 添加配置文件:數據庫
#freemark配置 spring.resources.static-locations=classpath:/static/ spring.freemarker.template-loader-path=classpath:/views/templates/ spring.freemarker.cache=false spring.freemarker.charset=UTF-8 spring.freemarker.check-template-location=true spring.freemarker.content-type=text/html spring.freemarker.expose-request-attributes=true spring.freemarker.expose-session-attributes=true spring.freemarker.request-context-attribute=request spring.freemarker.suffix=.ftl server.servlet-path=/api/*
③控制層請求訪問便可。
@Controller public class bonusPageController { @RequestMapping(value = "/getPage" ) public String getPage(){ return "index"; } }
注:其中spring.freemarker.template-loader-path根據本身的需求設置。
2.2 集成mybatis
①引入 mybatis,以及durid鏈接池,mysql支持jar包
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.0</version> </dependency>
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
②添加鏈接池和數據庫配置
#mybatis配置 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/stocks?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type = com.alibaba.druid.pool.DruidDataSource spring.datasource.filters = stat spring.datasource.maxActive = 20 spring.datasource.initialSize = 1 spring.datasource.maxWait = 60000 spring.datasource.minIdle = 1 spring.datasource.timeBetweenEvictionRunsMillis = 60000 spring.datasource.minEvictableIdleTimeMillis = 300000 spring.datasource.validationQuery = select 'x' spring.datasource.testWhileIdle = true spring.datasource.testOnBorrow = false spring.datasource.testOnReturn = false spring.datasource.poolPreparedStatements = true spring.datasource.maxOpenPreparedStatements = 20
#數據庫配置 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/stocks?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
③ 讀取配置文件
package com.example.demo.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; import java.sql.SQLException; @Configuration public class DruidConfig { private Logger logger = LoggerFactory.getLogger(getClass()); @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.validationQuery}") private String validationQuery; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.filters}") private String filters; @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean reg = new ServletRegistrationBean(); reg.setServlet(new StatViewServlet()); reg.addUrlMappings("/druid/*"); reg.addInitParameter("loginUsername", "druid"); reg.addInitParameter("loginPassword", "jiajian123456"); return reg; } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); filterRegistrationBean.addInitParameter("profileEnable", "true"); filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE"); filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION"); return filterRegistrationBean; } @Bean @Primary public DataSource druidDataSource(){ DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); try { datasource.setFilters(filters); } catch (SQLException e) { logger.error("druid configuration initialization filter", e); } return datasource; } }
注:能夠經過 localhost:端口/druid 監控鏈接池情況
帳號密碼在這段代碼中已配置。
@Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean reg = new ServletRegistrationBean(); reg.setServlet(new StatViewServlet()); reg.addUrlMappings("/druid/*"); reg.addInitParameter("loginUsername", "druid"); reg.addInitParameter("loginPassword", "jiajian123456"); return reg; }
啓動類
@EnableEurekaClient @EnableSwagger2 @SpringBootApplication @MapperScan("com.example.demo.mapper") public class StocksBonusApplication { public static void main(String[] args) { SpringApplication.run(StocksBonusApplication.class, args); } }
MapperScan 是寫代碼訪問數據庫的路徑(dao層),根據實際狀況書寫
2.3集成eureka
①引入jar包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
②在啓動類上面添加@EnableEurekaClient
③配置文件
#eureka配置 eureka.client.serviceUrl.defaultZone=http://localhost:18170/eureka/
2.4集成swagger
①引入jar包
<!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.6.1</version> </dependency>
② 啓動類添加@EnableSwagger2
③代碼實例
package com.example.demo.controller; import com.example.demo.mapper.ProductMapper; import demo.entity.Product; import demo.util.DrawLotteryUtil; import demo.util.ResponseResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; @Api(tags = "BonusController", description = "抽獎查詢相關接口") @RestController @RequestMapping("/bonus") public class BonusController { @Autowired private ProductMapper productMapper; // @ApiOperation(value = "1.會員登陸", notes = "1.會員登陸") // @ApiImplicitParams({ // @ApiImplicitParam(name = "keyword", paramType = "query", value = "會員號或手機號", required = true, dataType = "String", defaultValue = "766647"), // @ApiImplicitParam(name = "password", paramType = "query", value = "密碼", required = true, dataType = "String", defaultValue = "12345678"), // @ApiImplicitParam(name = "imgCode", paramType = "query", value = "圖形驗證碼", required = true, dataType = "String", defaultValue = "1234"), // }) //swagger 訪問地址 http://localhost:18171/swagger-ui.html#! @ApiOperation(value = "1.獲取獎品列表", notes = "1.獲取獎品列表") @RequestMapping(value = "/getProductList" ,method = RequestMethod.GET) public ResponseResult getProductList(){ return new ResponseResult(ResponseResult.SUCCESS,"獲取獎品列表",productMapper.getList()); } @ApiOperation(value = "2.獲取抽獎結果", notes = "2.獲取抽獎結果") @RequestMapping(value = "/getBonusReult" ,method = RequestMethod.GET) public ResponseResult getBonusReult(){ int index =0; List<Product> products=productMapper.getList(); if (!products.isEmpty()){ index= DrawLotteryUtil.drawGift(products); } return new ResponseResult(ResponseResult.SUCCESS,"獲取抽獎結果",products.get(index)); } }
3 微服務之間互相訪問(feignClient)
新建項目stocks-news 配置跟stocks-bonus同樣
①引入jar包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
②啓動類添加@EnableFeignClients
③寫微服務訪問實例
package com.example.demo.service; import demo.entity.Product; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.util.List; @FeignClient("stocks-bonus") public interface ProductService { @RequestMapping(value = "/bonus/getProductList" ,method = RequestMethod.GET) public List<Product> getProductList(); }
④代碼測試
package com.example.demo.controller; import com.example.demo.service.ProductService; import demo.entity.Product; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; @Api(tags = "BonusController", description = "抽獎查詢相關接口") @RestController @RequestMapping("/news") public class BonusController { @Autowired private ProductService productService; // @ApiOperation(value = "1.會員登陸", notes = "1.會員登陸") // @ApiImplicitParams({ // @ApiImplicitParam(name = "keyword", paramType = "query", value = "會員號或手機號", required = true, dataType = "String", defaultValue = "766647"), // @ApiImplicitParam(name = "password", paramType = "query", value = "密碼", required = true, dataType = "String", defaultValue = "12345678"), // @ApiImplicitParam(name = "imgCode", paramType = "query", value = "圖形驗證碼", required = true, dataType = "String", defaultValue = "1234"), // }) //swagger 訪問地址 http://localhost:18172/swagger-ui.html#! @ApiOperation(value = "1.獲取獎品列表", notes = "1.獲取獎品列表") @RequestMapping(value = "/getProductList" ,method = RequestMethod.GET) public List<Product> getProductList(){ return productService.getProductList(); } }
具體代碼訪問github:https://github.com/ningcs/stocks