使用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. 莫烦keras学习自修第一天【keras的安装】

    1. 安装步骤 (1)确保已经安装了python2或者python3 (2)安装numpy,python2使用pip2 install numpy, python3则使用pip3 install nu ...

  2. 老男孩python学习自修第五天【集合】

    特点: (1)无序 (2)不重复 使用场景: (1)关系测试 (2)去重 x & y 求交集 x | y 求并集 x - y 求差集 x ^ y 求对称差集 x.intersection(y) ...

  3. 虚拟机linux系统明明已经安装了ubuntu,但是每次重新进入就又是选择安装界面

    本文转载:https://blog.csdn.net/weixin_41522164/article/details/82814375

  4. sql查询表中重复数据个数

    select train_code,count(1) from tb_ask_trainbodyroadtrain group by train_code having count(1) >1

  5. Java中的getGenericSuperclass的基本用法

    通过getGenericSuperclass方法可以获取当前对象的直接超类的Type,使用该方法可以获取到泛型T的具体类型 package cn.tzz.lang.clazz; public clas ...

  6. Keepalived+LVS高可用负载均衡集群

    概述 Keepalived是专门针对LVS设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(HeathChecking)功能——判断LVS负载调度器.节点服务器的可用性,及 ...

  7. CH2601 电路维修(算竞进阶习题)

    01边bfs 这题很容易想到的就是根据符号的情况建图,把每个点方格的对角线看成图的节点,有线相连就是边权就是0,没有就是1 然后跑最短路,但是最短路用的优先队列维护是有logn的代价的 这题还有一个更 ...

  8. 【BZOJ2127】happiness 网络流

    题目描述 有\(n\times m\)个人,排成一个\(n\times m\)的矩阵.每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一 ...

  9. Kindle支持文档类型

    Kindle支持文档类型 Kindle个人文档服务目前只能转换并发送以下类型的文档:Microsoft Word (.doc, .docx) RTF文件(.rtf) HTML(.htm, .html) ...

  10. nginx+php使用open_basedir限制站点目录防止跨站

    以下三种设置方法均需要PHP版本为5.3或者以上.方法1)在Nginx配置文件中加入 fastcgi_param PHP_VALUE "open_basedir=$document_root ...