使用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. ssl证书部署问题

    问:我现在得到的ssl证书是.crt和.key两个在nginx环境下部署的证书,如果我们改用是tomcat,现在把这两个文件合成了.jks给tomcat使用,合成的时候输入的jks密码是不是就是部署在 ...

  2. lombok标签之@Data @AllArgsConstructor @@NoArgsConstructor -如何去除get,set方法。@Data注解和如何使用,lombok

    在代码中我们可以只加上标签@Data 而不用get,set方法: val : 和 scala 中 val 同名, 可以在运行时确定类型; @NonNull : 注解在参数上, 如果该类参数为 null ...

  3. APP测试重点(转载)

      1.安装卸载测试: app在不同的操作系统(安卓和ios),不同的版本,不同的机型上是否都能安装成功: 在安装过程中,突然断网或网络不好,是否给出有好的提示,网络恢复之后是否能正常下载: 在安装过 ...

  4. Python——WeRobot(微信公众号开发)

    模板消息接口 ''' 使用规则 1.所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限: 2.需要选择公众账号服务所 ...

  5. nargin

    nargin 编辑 nargin为“number of input arguments”的缩写. 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数.在matl ...

  6. codeforces605A

    Sorting Railway Cars CodeForces - 605A 一辆列车有N节车厢,编号为1...N(每节车厢编号都不同),并且他们的排列是混乱的.李老湿想要把这N节车厢重新排列为升序排 ...

  7. Android 模块化/热修复/插件化 框架选用

    概念汇总 动态加载:在程序运行的时候,加载一些程序自身原本不存在的文件并运行这些文件里的代码逻辑.动态加载是热修复与插件化实现的基础. 热修复:修改部分代码,不用重新发包,在用户不知情的情况下,给ap ...

  8. 进程间通信IPC与Binder机制原理

    1, Intent隐式意图携带数据 2, AIDL(Binder) 3, 广播BroadCast 4, 内容提供者ContentProvider 5,Messager(内部通过binder实现) 6, ...

  9. Auth模块使用方法大全

    auth认证 导包 from django.contrib import auth 默认数据库中使用auth_user表 创建超级用户 python manage.py createsuperuser ...

  10. C# 调用短信接口

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...