Spring boot学习整理
目录:
- Springboot结合hbase
- Springboot结合elasticsearch
- Springboot结合RestTemplate处理Http请求
- Springboot的maven相关
- Springboot结合dubbox
- Springboot的banner设定
- Springboot结合Kafka
Springboot结合hbase
首先在pom中添加依赖
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.2.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>org.mortbay.jetty</groupId> <artifactId>servlet-api-2.5</artifactId> </exclusion> <exclusion> <groupId>org.mortbay.jetty</groupId> <artifactId>servlet-api-2.5-6.1.14</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.6.0</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> </exclusions> </dependency>
代码:
@Autowired public SearchDaoImpl(AppSettings appSettings){ this.appSettings = appSettings; Configuration HBASE_CONFIG = new Configuration(); //与hbase/conf/hbase-site.xml中hbase.zookeeper.quorum配置的值相同 HBASE_CONFIG.set("hbase.zookeeper.quorum", appSettings.getHbasename()); //与hbase/conf/hbase-site.xml中hbase.zookeeper.property.clientPort配置的值相同 HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", appSettings.getHbaseport()); conf = HBaseConfiguration.create(HBASE_CONFIG); }
Springboot结合elasticsearch
1.maven设置
springboot的版本是1.5.1.RELEASE。这个版本springboot使用的ES版本是2.4.4,其依赖的guava是16.0.1
这里我们需要手动指定guava为18.0版本,否则会出现异常 java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor
... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency> ....
2.修改配置,在application.properties中添加以下内容
########### es setting ########### spring.data.elasticsearch.cluster-name=yq-cluster spring.data.elasticsearch.cluster-nodes=node3.test.cn:9300,node4.test.cn:9300,node5.test.cn:9300 spring.data.elasticsearch.local=false spring.data.elasticsearch.repositories.enabled=true
3.创建实体类(与ES中存储的内容格式对应)
package com.product; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; @Document(indexName = "yuqing", type = "emp", shards = 3, replicas = 1, refreshInterval = "-1") public class MyClient { @Id private String id; private String first_name; private String last_name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } }
4.建立资源库
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface ClientRepository extends ElasticsearchRepository<MyClient, String> { }
5.服务接口
public interface EsService { MyClient findClient(String id); }
6.服务实现
import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class EsServiceImpl implements EsService { @Autowired private ClientRepository clientDao; private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(EsServiceImpl.class); public MyClient findClient(String id) { MyClient client = clientDao.findOne(id); LOG.info(" get cliente by id {} is {}", id, client); return client; } }
7.应用
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/es/") public class EsController { @Autowired private EsService esl; @RequestMapping(value = "test", method = RequestMethod.POST) public Object test(@RequestBody String id) { return esl.findClient(id); } }
参考:Spring boot + elasticsearch的最简单实践
在实际使用中要注意,安装的es版本与springboot中引用的es版本不能有差异不能太大。
例如安装的是2.4.2的,那么api使用的2.4.x基本没问题,但如果引用5.x以上那肯定就不行了,会提示 None of the configured nodes are available
所以使用时要先看一下当前 spring-data-elasticsearch 所使用的es版本
Springboot结合RestTemplate处理Http请求
先定义config bean
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(5000);// ms factory.setConnectTimeout(15000);// ms return factory; } }
应用
注:针对返回结果的序列化问题,目前没有找到方便快捷的方式,只好通过Object转HashMap的途径解决(虽然这种方法在属性多的情况下也比较复杂)
RestTemplate.getForObject虽然可以指定为业务类,但是转换始终有问题。
@RestController @EnableAutoConfiguration @Import(value = { RestTemplateConfig.class }) public class SpringRestTemplateApp { @Autowired RestTemplate restTemplate; /*********** HTTP GET method *************/ @RequestMapping("") public String hello() { String url = "http://localhost:8081/user"; HashMap<String,Object> user = (HashMap<String,Object>)restTemplate.getForObject(url, Object.class); return user.get("name").toString(); } @RequestMapping("/user") public User genUser() { User user = new User(); user.setAge(18); user.setName("Ray"); return user; }public class User { private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static void main(String[] args) throws Exception { SpringApplication.run(SpringRestTemplateApp.class, args); } }
如果想将返回结果转换为实体对象(比如前面代码中的User),需要以字符串接收结果,然后再转换为对象。
不过java的json工具(我用的jackson)貌似不是很给力,也或许是我使用不当,总感觉比C#的差多了,转换个json都好麻烦,尤其是复杂对象的时候(嵌套多层类,并且有List)
先定义实体类,这里要注意的是,如果有嵌套的类,必须要定义为静态类
public class Company { @JsonIgnoreProperties(ignoreUnknown=true) public static class Employee { public Employee () { } private String name; public String getName() { return name; } public void setName(String name) { this.name= name; } } public Company () { } private List<Employee> emps; public List<Employee> getEmployees() { return emps; } public void setEmployees(List<Employee> Employees) { this.emps= Employees; } }
转换
public class TransferTest { private static TransferTest instance; public static TransferTest instance() { if (instance == null) { instance = new TransferTest(); } return instance; } public TransferTest() {
//只需要定义一次 objectMapper = new ObjectMapper() { private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper = new com.fasterxml.jackson.databind.ObjectMapper(); public <T> T readValue(String value, Class<T> valueType) { try { return jacksonObjectMapper.readValue(value, valueType); } catch (IOException e) { throw new RuntimeException(e); } } public String writeValue(Object value) { try { return jacksonObjectMapper.writeValueAsString(value); } catch (Exception e) { throw new RuntimeException(e); } } }; } private Company doTransfer(String origin, String from, String to) throws UnirestException { String resp = restTemplate.getForObject(<url>,<data>,String.Class); //使用某种http工具类以字符串获取返回结果 Company data = objectMapper.readValue(str, Company.class); return data ; } }
真的感觉好麻烦/(ㄒoㄒ)/~~
Springboot的maven相关
在将springboot项目发布的时候我们都是用maven打包成jar包,然后使用 java -jar xxx.jar 直接启动
但是有时候发现执行之后会提示找不到启动程序。
解决方法:在pom文件中添加以下内容
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.5.2.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Springboot的banner设定
Springboot的banner很容易设置,只需要将banner.txt文件加到 src/main/resources 目录下即可
这里给出一个码农保护神
${AnsiColor.BRIGHT_YELLOW} //////////////////////////////////////////////////////////////////// // _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/`---'\____ // // .' \\| |// `. // // / \\||| : |||// \ // // / _||||| -:- |||||- \ // // | | \\\ - /// | | // // | \_| ''\---/'' | | // // \ .-\__ `-` ___/-. / // // ___`. .' /--.--\ `. . ___ // // ."" '< `.___\_<|>_/___.' >'"". // // | | : `- \`.;`\ _ /`;.`/ - ` : | | // // \ \ `-. \_ __\ /__ _/ .-` / / // // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 永不宕机 永无BUG // //////////////////////////////////////////////////////////////////// ${AnsiColor.BRIGHT_RED} Application Version: ${application.version}${application.formatted-version} Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
参考:https://blog.csdn.net/baochanghong/article/details/54286422