使用IDEA建立SpringBoot多模块工程不爽啊~算了凑合用吧。

第一步、建立一个POM工程

..Next

..一路next即可,中间啥也不选

第二步、建立Eureka服务器(这个玩意等同于玩Dubbo时候的Zookeeper)

在项目上右键--

..还是Springboot

..

..选择依赖

..一路next即可

修改application.properties

server.port=

# 不向注册中心注册自己
eureka.client.register-with-eureka=false
# 自己就是注册中心,职责是维护服务
eureka.client.fetch-registry=false
# 服务端实例名称
eureka.instance.hostname=localhost
#暴露的注册地址
eureka.client.service-url.defaultZone=http://localhost:8888/eureka

启动类添加注解

修改parent工程pom文件,也就是加一个module啦

    <modules>
<module>eureka-server</module>
</modules>

修改本工程pom文件,把parent换成你建立的cloud-parent,而cloud-parent已经依赖了 spring-boot-starter-parent

    <parent>
<groupId>com.cloud</groupId>
<artifactId>cloud-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

接下来启动,先看一下注册中心的管控台http://localhost:8888/

什么都没有。等服务提供者出来就有了。

第三步、建立Common模块

..

..

..人家目录啥都没有,所以你得自己建

book类

package com.cloud.common.entity;

import lombok.Getter;
import lombok.Setter; import java.io.Serializable;
import java.util.Date; @Getter
@Setter
public class Book implements Serializable { private Long id;
private String bookName; // 书名
private String bookSize; // 开本
private String pack; // 包装
private String ISBN; // isbn
private String publisher; // 出版社
private Date publishTime; // 出版时间 }

BaseResponse

package com.cloud.common.response;

import lombok.Getter;
import lombok.Setter; import java.io.Serializable; @Getter
@Setter
public class BaseResponse<T> implements Serializable {
private int code;
private String desc;
private T data; public BaseResponse(int code, String desc) {
this.code = code;
this.desc = desc;
}
}

加入依赖:

    <dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

 第四步、建立服务提供者

..

..

..完成后打开pom文件,注意这个东西,这个东西在前面版本是不一样的

..

加入额外的依赖

        <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>

在dependencies的最后加入common的依赖

   <dependency>
<groupId>com.cloud</groupId>
<artifactId>cloud-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

把parent也改了

    <parent>
<groupId>com.cloud</groupId>
<artifactId>cloud-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

然后去父模块增加一个module

现在是代码部分:

配置文件:

server.port=8080
# 服务名
spring.application.name=BookServiceProvider spring.jackson.date-format=yyyy-MM-dd
spring.jackson.time-zone=GMT+8 mybatis.config-location=classpath:mybatis/mybatis.xml
mybatis.mapper-locations=classpath:mybatis/mapper/**/*.xml
mybatis.type-aliases-package=com.cloud.common.entity spring.datasource.url=jdbc:mysql://localhost:3306/cloud?useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=1234 # 注册地址
eureka.client.service-url.defaultZone=http://localhost:8888/eureka
# 注册名
eureka.instance.instance-id=book-service-provider
eureka.instance.prefer-ip-address=true info.name: book-service-provider
info.version: v1.0

启动类加上两个注解

@EnableEurekaClient
@EnableDiscoveryClient

DAO

package com.cloud.bookserviceprovider.dao;

import com.cloud.common.entity.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import java.util.List; @Mapper
@Repository
public interface BookDAO { int addBook(Book book); Book getBookById(@Param("id") Long id); List<Book> getBooks();
}

Service

package com.cloud.bookserviceprovider.service;

import com.cloud.common.entity.Book;
import org.apache.ibatis.annotations.Param; import java.util.List; public interface BookService { int addBook(Book book); Book getBookById(@Param("id") Long id); List<Book> getBooks();
}

impl

package com.cloud.bookserviceprovider.service.impl;

import com.cloud.bookserviceprovider.dao.BookDAO;
import com.cloud.bookserviceprovider.service.BookService;
import com.cloud.common.entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.List; @Service
public class BookServiceImpl implements BookService { @Autowired
private BookDAO bookDAO; @Override
public int addBook(Book book) {
return bookDAO.addBook(book);
} @Override
public Book getBookById(Long id) {
return bookDAO.getBookById(id);
} @Override
public List<Book> getBooks() {
return bookDAO.getBooks();
}
}

..BookDAOMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cloud.bookserviceprovider.dao.BookDAO"> <insert id="addBook" parameterType="Book">
INSERT INTO book(bookName,bookSize,pack,isbn,publisher,publishTime)
VALUES(#{bookName},#{bookSize},#{pack},#{ISBN},#{publisher},#{publishTime})
</insert> <select id="getBooks" resultType="Book">
select * from book
</select> <select id="getBookById" resultType="Book">
select * from book where id=#{id}
</select> </mapper>

mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
</configuration>

BookController

package com.cloud.bookserviceprovider.controller;

import com.alibaba.fastjson.JSONObject;
import com.cloud.bookserviceprovider.service.BookService;
import com.cloud.common.entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController
@RequestMapping("/book")
public class BookController { @Autowired
private BookService bookService; @Autowired
private DiscoveryClient discoveryClient; @RequestMapping("/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
services.forEach(e -> System.err.println(e));
List<ServiceInstance> list = discoveryClient.getInstances("BOOKSERVICEPROVIDER");
list.forEach(e -> {
System.out.println(e.getServiceId() + "," + e.getHost() + "," + e.getPort() + "," + e.getUri());
});
return this.discoveryClient;
} @RequestMapping("/add")
public int addBook(@RequestBody Book book){
return bookService.addBook(book);
} @RequestMapping("/get/{id}")
public Book getBookById(@PathVariable("id") Long id){
return bookService.getBookById(id);
} @RequestMapping("/getAll")
public String getBooks(){
return JSONObject.toJSONString(bookService.getBooks());
}
}

数据库脚本

CREATE TABLE `book` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`bookName` varchar(55) NOT NULL,
`bookSize` varchar(10) NOT NULL,
`pack` varchar(10) NOT NULL,
`isbn` varchar(55) NOT NULL,
`publisher` varchar(55) NOT NULL,
`publishTime` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

整体目录:

现在呢,先启动注册中心,再启动服务提供者,打开管理界面,出现了一个服务

你点击,会出现

这就是application.properties配置的info信息。

第五步、建立服务消费者

..

..

修改pom文件(其实跟提供者类似)

把parent改成

    <parent>
<groupId>com.cloud</groupId>
<artifactId>cloud-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

加入common依赖

        <dependency>
<groupId>com.cloud</groupId>
<artifactId>cloud-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

父工程pom,添加module

application.properties

server.port=8081

# 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8888/eureka
# 不向注册中心注册自己
eureka.client.register-with-eureka=false

配置类

package com.cloud.bookserviceconsumer.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate; @Configuration
public class ConsumerConfig { @Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

controller

package com.cloud.bookserviceconsumer.controller;

import com.cloud.common.entity.Book;
import com.cloud.common.response.BaseResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; @RestController
@RequestMapping("/consume/book")
public class BookController { private static final String URL = "http://localhost:8080"; @Autowired
private RestTemplate restTemplate; @RequestMapping("/add")
public BaseResponse<Integer> addBook(@RequestBody Book book){
Integer integer = restTemplate.postForObject(URL + "/book/add", book, Integer.class);
BaseResponse<Integer> response = new BaseResponse<>(0,"Success");
response.setData(integer);
return response;
} @RequestMapping("/get/{id}")
public ResponseEntity<Book> getBookById(@PathVariable("id") Long id){
return restTemplate.getForEntity(URL + "/book/get/" + id,Book.class);
} @RequestMapping("/getAll")
public String getBooks(){
String s = restTemplate.getForObject(URL + "/book/getAll", String.class);
return s;
}
}

最后访问

给你个示例json

{
"bookName": "Apache Kafka实战",
"bookSize": "16开",
"pack": "平装",
"isbn": "9787121337765",
"publisher": "电子工业出版社",
"publishTime": "2018-05-01"
}

添加操作

查询操作

最后展示一下服务发现(感觉很鸡肋),就是读取现有的服务名称

GitHub

SpringCloud第一弹(入门)的更多相关文章

  1. Hadoop基础-MapReduce的工作原理第一弹

    Hadoop基础-MapReduce的工作原理第一弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在本篇博客中,我们将深入学习Hadoop中的MapReduce工作机制,这些知识 ...

  2. [Git] 002 初识 Git 与 GitHub 之加入文件 第一弹

    在 GitHub 的 UI 界面使用 Git 往仓库里加文件 第一弹 1. 点击右上方的 Create new file 2. 在左上方填入文件名,若有后缀,记得加上 3. 页面跳转,此时已有两个文件 ...

  3. Spring Boot 第一弹,问候一下世界!!!

    持续原创输出,点击上方蓝字关注我吧 目录 前言 什么是Spring Boot? 如何搭建一个Spring Boot项目? 第一个程序 Hello World 依赖解读 什么是配置文件? 什么是启动类? ...

  4. typecho流程原理和插件机制浅析(第一弹)

    typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...

  5. Python第一天——入门Python(1)数据定义

    数据类型: 什么是数据? 在计算机科学中,数据是指所有能输入到计算机并被计算机程序处理的符号的介质的总称,是用于输入电子计算机进行处理,具有一定意义的数字字母.符号和模拟量等的统称.现在计算机存储和处 ...

  6. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员 ...

  7. 我的长大app开发教程第一弹:Fragment布局

    在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...

  8. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第一章 入门篇-开篇及总体规划

    .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划   原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来 ...

  9. 第一篇 入门必备 (Android学习笔记)

    第一篇 入门必备 第1章 初识Android 第2章 搭建你的开发环境 第3章 创建第一个程序--HelloWorld 第4章 使用Android工具   ●Android之父 Android安迪·罗 ...

随机推荐

  1. maven配置,jdk1.8

    <!-- 局部jdk配置,pom.xml中 --> <build> <plugins> <plugin> <groupId>org.apac ...

  2. Ajax之Jquery封装使用举例2(Json和JsonArray处理)

    本例主要使用ajax进行异步数据请求,并针对返回数据为json和jsonarray类型的数据处理. 本例中只有前端的代码,后端代码不是本文重点,故省略. 后端接口返回数据为: Json: {" ...

  3. javascript帧动画

    前面的话 帧动画就是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成的动画.由于是一帧一帧的画,所以帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容. ...

  4. 查询的model里面 一般都要有一个要返回的model做属性 ;查询前要传入得参数,查询后返回的参数 都要集合在一个model中

    查询的model里面 一般都要有一个要返回的model做属性

  5. webpack 打包编译-webkit-box-orient: vertical 后消失

    /* autoprefixer: off */ -webkit-box-orient: vertical; // 参考 https://github.com/postcss/autoprefixer/ ...

  6. BZOJ5037[Jsoi2014]电信网络——最大权闭合子图

    题目描述 JYY创建的电信公司,垄断着整个JSOI王国的电信网络.JYY在JSOI王国里建造了很多的通信基站.目前所有的基站 都是使用2G网络系统的.而现在3G时代已经到来了,JYY在思考,要不要把一 ...

  7. Elasticsearch 聚合统计与SQL聚合统计语法对比(一)

    Es相比关系型数据库在数据检索方面有着极大的优势,在处理亿级数据时,可谓是毫秒级响应,我们在使用Es时不仅仅进行简单的查询,有时候会做一些数据统计与分析,如果你以前是使用的关系型数据库,那么Es的数据 ...

  8. I - Tunnel Warfare HDU - 1540 线段树最大连续区间

    题意  :一段区间  操作1 切断点 操作2 恢复最近切断的一个点 操作3 单点查询该点所在最大连续区间 思路:  主要是push_up :  设区间x 为母区间  x<<1 ,x< ...

  9. 为什么开启子进程 一定要放在 if __name__ == '__main__' 下面

  10. MT【267】第一次很重要

    \begin{equation*}\textbf{已知}x_1,x_2<\pi,x_{n+1}=x_n+\left\{ \begin{aligned} sin x_n &,x_n> ...