SpringBoot SpringCloud學習
阿新 • • 發佈:2018-11-26
文章目錄
SpringBoot SpringCloud學習
快速建立應用,簡化配置,大量使用註解配置,建立可執行的jar工程,預設讀取根目錄的application.properties/application.yml檔案,bootstrap.yml
1. 建立基本maven工程,修改pom.xml,完整內容如下
<parent>
<groupId>org.springframework.boot</groupId >
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
< artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 整合spring Data -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- mysql 驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 阿里巴巴資料來源包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
</dependency>
<!-- 整合eureka服務 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- jsp配置 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- 測試環境依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<outputDirectory>../deploy</outputDirectory>
<classifier>exec</classifier>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<outputDirectory>../deploy</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
2. 新建Application.java類,添加註解配置
@SpringBootApplication
@EnableDiscoveryClient
@PropertySource("classpath:/jdbc.properties")
@EntityScan(basePackageClasses = IdEntity.class)
3. 新增main方法
public static void main(String[] args) {
SpringApplication.run(Application1.class, args);
}
4. 使用RestTemplate呼叫遠端服務
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
RestTemplate template = new RestTemplate();
SimpleClientHttpRequestFactory factory = (SimpleClientHttpRequestFactory) template.getRequestFactory();
factory.setConnectTimeout(3000);
factory.setReadTimeout(3000);
return template;
}
- 在method上使用註解LoadBalanced表示restTemplate使用LoadBalancerClient執行請求。
- 使用時,可以直接引入依賴,然後根據serverId + 服務url呼叫,springCloud會自動從zookeeper服務中獲取可用的服務
//serviceId = foo, 服務url= /user
ResponseEntity<User> resp = restTemplate.getForEntity("http://foo/user", User.class);
5. 配置資料來源
新增配置檔案
spring.datasource.url: jdbc:mysql://192.168.1.144:3306/spttopup?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username: spttestuser
spring.datasource.password: sptuserpasswd
spring.datasource.driver: com.mysql.jdbc.Driver
spring.datasource.filters: stat
spring.datasource.showSql: true
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
新增對應的配置類DataSourceConfig.java,在類頭部添加註解@Component
@ConfigurationProperties(prefix = “spring.datasource”),啟動時,會自動將對應的配置值賦給同名的屬性
private String driver;
private String url;
private String username;
private String password;
private int initialSize;
private int minIdle;
private int maxActive;
private int maxWait;
private int timeBetweenEvictionRunsMillis;
private int minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
private String filters;
private String connectionProperties;
新增DataSource配置
@Bean // 宣告其為Bean例項
@Primary // 在同樣的DataSource中,首先使用被標註的DataSource
public javax.sql.DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driver);
// configuration
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);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
logger.error("druid configuration initialization filter", e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
6. 整合zookeeper
<!-- 整合zookeeper服務 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
在application.properties裡面新增連線配置
spring.cloud.zookeeper.connect-string: 192.168.1.51:2181
注意,如果你依賴了spring-cloud-starter-zookeeper-config,以上配置想必須寫在bootstrap.yml中
7. 整合eureka服務
新建eureka server工程,新增依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
添加註解配置
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
@Bean
public Filter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter =new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
}
}
在application.yml中新增配置檔案
server:
port: 8888
eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8888/eureka/
server:
waitTimeInMsWhenSyncEmpty: 0
新增依賴
<!-- 整合eureka服務 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在application.properties裡面新增配置
# eureka
eureka.instance.leaseRenewalIntervalInSeconds:10
eureka.instance.metadataMap.instanceId:${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${random.value}}}
eureka.client.registryFetchIntervalSeconds:5
eureka.client.serviceUrl.defaultZone:http://localhost:8888/eureka/
在啟動類裡添加註解
@EnableDiscoveryClient
8. 其他配置
服務名配置,在bootstrap.yml中新增
spring:
application:
name: foo1
埠配置,application.yml
server:
port: 8081
jsp模板配置,application.yml
spring:
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
hibernate相關配置
# 開啟hibernate統計資訊
spring.jpa.properties.hibernate.generate_statistics=true
# 開啟二級快取
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
# 開啟查詢快取
spring.jpa.properties.hibernate.cache.use_query_cache=true
# 指定快取provider
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
# 配置shared-cache-mode
spring.jpa.properties.javax.persistence.sharedCache.mode=ENABLE_SELECTIVE
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.show-sql=true
log配置
logging.level.root=INFO
logging.level.org.springframework.web=INFO
logging.level.org.hibernate=ERROR
9. 單元測試
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application1.class)
public class DictServiceTest {
@Autowired
private DictService dictService;
@Test
public void save() throws Exception {
DictType entity = new DictType();
entity.setDictTypeCd("test_14");
entity.setDictTypeName("測試_04");
dictService.save(entity);
System.out.println("-------------");
}
}
10. 整合SpringSession
新增jar依賴
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
application.properties裡面新增redis連結配置
spring.redis.host=192.168.1.144
spring.redis.port=6379
添加註解配置
@EnableRedisHttpSession
public class HttpSessionConfig {
}
11. 整合mybatis
新增jar依賴
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
添加註解配置
@MapperScan(basePackages = "com.spt.master.dao", annotationClass = MyBatisDao.class)
新增sessionFactory配置
@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory rdsSqlSessionFactory(DataSource rdsDataSource) throws Exception {
logger.info("*************************sqlSessionFactory:begin***********************");
VFS.addImplClass(SpringBootVFS.class);
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(rdsDataSource);
sessionFactory.setTypeAliasesPackage("com.spt.master.entity,com.spt.master.dto,com.spt.commutil.entity");
//sessionFactory.setTypeAliases(new Class<?>[] { TblSptDictionaryEntity.class });
// sessionFactory.setTypeHandlersPackage(properties.typeHandlerPackage);
PaginationInterceptor interceptor = new PaginationInterceptor();
Properties props = new Properties();
props.setProperty("jdbc.type", "mysql");
interceptor.setProperties(props);
sessionFactory.setPlugins(new Interceptor[] { interceptor });
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath:mybatis/mappers/*.xml"));
// sessionFactory
// .setConfigLocation(new
// PathMatchingResourcePatternResolver().getResource(properties.configLocation));
SqlSessionFactory resultSessionFactory = sessionFactory.getObject();
// logger.info("===typealias==>" +
// resultSessionFactory.getConfiguration().getTypeAliasRegistry().getTypeAliases());
logger.info("*************************sqlSessionFactory:successs:" + resultSessionFactory);
return resultSessionFactory;
}
12. SpringBoot瘦身
配置外掛,過濾不常變動的jar包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<outputDirectory>${jar.output}</outputDirectory>
<layout>ZIP</layout>
<excludeGroupIds>
org.springframework.boot,
org.springframework,
org.springframework.data,
org.mybatis.spring.boot,
org.mongodb,
org.codehaus.groovy,
redis.clients,
org.attoparser,
org.mybatis,
org.springframework.session,
com.github.0604hx,
com.fasterxml.jackson.core,
commons-beanutils,
commons-codec,
org.apache.commons,
org.apache.tomcat.embed,
org.apache.tomcat,
mysql,
org.hibernate,
org.slf4j,
com.jayway,
org.jboss,
com.alibaba,
com.fasterxml,
commons-collections,
ch.qos.logback,
org.scala-lang,
org.yaml,
org.jboss.logging,
javax.validation,
nz.net.ultraq.thymeleaf,
org.thymeleaf,
ognl,
org.unbescape,
org.javassist
</excludeGroupIds>
</configuration>