springcloud笔记一
微服务的概述
- 什么是微服务?
现今微服务界没有一个统一的、标准的定义
微服务化的核心就是将统一的一站式应用,根据业务拆分成一个一个的服务,彻底的去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事, 从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动 或销毁,拥有自己独立的数据库
- 微服务的架构
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API).每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、生产环境等.另外,应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建.
有哪些优点?
- 每个服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求
- 开发简单、开发效率提高,一个服务可能就是专一的只干一件事.
微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的.
微服务能试用不同的语言开发
易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins,Hudson
微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果.无需通过合作才能体现价值
- 微服务允许你利用融合最新技术
微服务只是业务逻辑的代码,不会和HTML,CSS或其他界面组件混合.
每个微服务都有自己的存储能力,可以有自己的数据库.也可以有统一的数据库
有哪些缺点:
开发人员要处理分布式系统的复杂性
多服务运维难度,随着服务的增加,运维的压力也在增大
系统部署依赖
服务间通信成本
数据一致性
系统集成测试
性能监控
SpringBoot和SpringCloud那点事?
SpringBoot专注于快速方便的开发单个个体微服务。
SpringCloud是关注于全局微服务协调治理框架,他将Springboot开发的一个个单体微服务整合并管理起来,为各个微服务质检提供配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等集成服务。
Springboot可以离开SpringCloud单独的使用开发项目,但是SpringCloud不能离开Springboot,属于依赖的关系。
Springboot专注于快速、方便的开发单个微服务个体。
SpringCloud关注全局的服务治理框架。
SpringCloud中文网:https://springcloud.cc/
参考资料:https://www.springcloud.cc/spring-cloud-netflix.html
使用springcloud做一个简单的查询操作搭建项目的开发环境:
- 创建一个普通的maven工程(不用勾选任何选项),此时创建的是一个父工程
(以上创建一个普通的maven工程如果有哪里不清晰,可以查看MyBatis入门的第一天,里面有讲解:https://www.cnblogs.com/LBJLAKERS/p/11324234.html)
在pom.xml文件夹中更改他的打包的方式,添加一句。
项目的打包类型:pom、jar、war
packing默认是jar类型,
<packaging>pom</packaging> ---------> 父类型都为pom类型
<packaging>jar</packaging> ---------> 内部调用或者是作服务使用
<packaging>war</packaging> ---------> 需要部署的项目
<packaging>pom</packaging>
在创建一个子工程,创建方式,如图:(名称为:zhservicecloud-common)
在父工程下创建一个子工程的方式:
- 使用同样的方式分别创建子工程:txservicecloud-provider-dept-8001、txservicecloud-consumer-dep-80.
- 在父工程中的pom.xml文件中导入坐标
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0..RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement> - 在MySQL的数据库中创建一个dept的表结构,并插入数据:
DROP DATABASE IF EXISTS cloudDB01;
CREATE DATABASE cloudDB01 CHARACTER SET UTF8;
USE cloudDB01;
CREATE TABLE dept
(
deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(),
db_source VARCHAR()
);
INSERT INTO dept(dname,db_source) VALUES('开发部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('财务部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('市场部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('运维部',DATABASE()); SELECT * FROM dept;
- 创建一个applicatioon.xml文件。用来配置数据库的基本配置
server:
port:
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路径
type-aliases-package: zh.stu.service.model #所有Entity别名类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml #mapper映射文件
spring:
application:
name: zhservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
driver-class-name: com.mysql.jdbc.Driver #mysql驱动包
url: jdbc:mysql://localhost:3306/cloudDB01 #数据库名称
username: root
password: zhanghao22333
dbcp2:
min-idle: #数据库连接池的最小维持连接数
initial-size: #初始化连接数
max-total: #最大连接数
max-wait-millis: #等待连接获取的最大超时时间 - 因为在applicatioon.xml文件中mybatis.cfg.xml的文件配置,所以在创建一个此文件即可
- 创建一个部门的model,并要实现序列化的接口
public class Dep implements Serializable{
private Long deptno; // 主键
private String dname; // 部门名称
private String db_source;// 来自那个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同数据库 public Long getDeptno() {
return deptno;
} public void setDeptno(Long deptno) {
this.deptno = deptno;
} public String getDname() {
return dname;
} public void setDname(String dname) {
this.dname = dname;
} public String getDb_source() {
return db_source;
} public void setDb_source(String db_source) {
this.db_source = db_source;
}
}
- 其中创建的子工程txservicecloud-provider-dept-8001,是服务的提供者。在他的pom.xml文件中导入坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>cn.tx.springcloud1</groupId>
<artifactId>txservicecloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies> 在provider的工程下创建一个deptdao的接口。
package zh.stu.dao; import org.apache.ibatis.annotations.Mapper;
import zh.stu.service.model.Dept; import java.util.List; @Mapper
public interface DeptDao { boolean addDept (Dept dept); Dept findById(Long id); List<Dept> findAll();
}创建一个service接口:DeptService
package zh.stu.service; import org.springframework.transaction.annotation.Transactional;
import zh.stu.service.model.Dept; import java.util.List; @Transactional
public interface DeptService {
// 添加数据
boolean addDept (Dept dept);
// 根据条件查询
Dept findById(Long id);
// 查询数据库表中的所有数据
List<Dept> findAll();
}- 在resource目录下创建一个mapper.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="zh.stu.dao.DeptDao">
<select id="findById" resultType="dept" parameterType="Long">
SELECT d.deptno,d.dname,d.db_source FROM dept d WHERE d.deptno=#{deptno}
</select>
<select id="findAll" resultType="dept">
SELECT d.deptno,d.dname,d.db_source FROM dept d
</select>
<insert id="addDept" parameterType="dept">
INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());
</insert>
</mapper>
实现该service接口
package zh.stu.service.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import zh.stu.dao.DeptDao;
import zh.stu.service.DeptService;
import zh.stu.service.model.Dept; import java.util.List; @Service
public class DeptServiceImpl implements DeptService { @Autowired
private DeptDao deptDao; @Override
public boolean addDept(Dept dept) {
return deptDao.addDept(dept);
} @Override
public Dept findById(Long id) {
return deptDao.findById(id);
} @Override
public List<Dept> findAll() {
return deptDao.findAll();
}
}创建一个controller
package zh.stu.controller; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import zh.stu.service.DeptService;
import zh.stu.service.model.Dept; import java.util.List; @RestController
public class DeptController { @Autowired
private DeptService deptService; @RequestMapping(value = "/dept/add",method = RequestMethod.POST)
public boolean add(@RequestBody Dept dept)
{
return deptService.addDept(dept);
} @RequestMapping(value = "/dept/get/{id}",method = RequestMethod.GET)
public Dept dept (@PathVariable("id") Long id){
return deptService.findById(id);
} @RequestMapping(value = "/dept/list",method = RequestMethod.GET)
public List<Dept> dept()
{
return deptService.findAll();
}
}- 添加一个SpringApplicationTx类,运行此类,在控制台输入控制器中添加的路径:http://localhost:8001/dept/list
package zh.stu; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class SpringApplicationTx {
public static void main(String[] args) {
SpringApplication.run(SpringApplicationTx.class,args);
}
}结果:
附一张项目结构图
- 以上是服务的提供端
- 在consumer和provider之间的的调用,在consummer端对provider的调用
- 同样是在resource的目录下新添加一个application.xml的文件:制定端口号80
server:
port: - 在新加一个RestConfigBean的类,将RestTemplate交给容器
package zh.stu; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate; @Configuration
public class RestConfigBean {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
} - 添加控制器,对两不同条件的查询做测试
package zh.stu.controller; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import zh.stu.service.model.Dept; import java.util.List; @RestController
public class DeptController { private String REST_URL_PREFIX="http://localhost:8001/"; @Autowired
private RestTemplate restTemplate; @RequestMapping("/consumer/dept/getdept/{id}")
public Dept getDept(@PathVariable("id") Long id){
return restTemplate.getForObject(REST_URL_PREFIX+"dept/get/"+id,Dept.class);
} @RequestMapping("/consumer/dept/findall")
public List<Dept> findAll(){
return restTemplate.getForObject(REST_URL_PREFIX+"dept/list",List.class);
}
} - 创建SpringAppConsumerTx类文件
package zh.stu; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class SpringAppConsumerTx {
public static void main(String[] args) {
SpringApplication.run(SpringAppConsumerTx.class,args);
}
}启动之后在地址栏根据在控制器中添加的路径输地址,可查询出相应的数据。
注意:在启动consumer端的SpringAppConsumerTx之前,就应该把provider端启动起来,因为在consumer端要访问provider。
springcloud笔记一的更多相关文章
- SpringCloud笔记六:Hystrix
目录 Hystrix是什么? Hystrix服务熔断 新建Hystrix项目 修改yml Maven的pom.xml添加hystrix引用 修改Controller Hystrix服务降级 修改api ...
- SpringCloud笔记五:Feign
目录 什么是Feign? 有了Ribbon我还要Feign干嘛? 新建consumer-feign 修改api项目 引入Maven文件 新建feign的接口 启动项目 报错 发泄发泄心情,一个段落 什 ...
- SpringCloud笔记四:Ribbon
目录 什么是Ribbon? Ribbon的配置 Maven引入 开启注解 Ribbon负载均衡 新建provider8002和8003 Ribbon核心组件IRule Ribbon自定义 什么是Rib ...
- SpringCloud笔记三:Eureka服务注册与发现
目录 什么是Eureka? Eureka注册的三大步 第一步,引用Maven 第二步,配置yml 第三步,开启Eureka注解 新建Eureka子项目 把provider子项目变成服务端 Eureka ...
- SpringCloud笔记二:搭建项目基础框架
目录 搭建框架 新建父工程 新建子工程api 新建子工程提供者provider 新建消费者consumer 总结 搭建框架 我们的SpringCloud微服务框架是父子工程,有一个父工程,剩下的都是子 ...
- SpringCloud笔记一:扫盲
目录 前言 什么是微服务? 微服务的优缺点是什么? 微服务之间是如何通讯的? SpringCloud和Dubbo有哪些区别? SpringCloud和SpringBoot的关系? 什么是服务熔断?什么 ...
- springCloud笔记
分布式和集群的理解:比如在一个厨房有两个厨师,一个炒菜,一个洗菜,各自做不同的事情,但是却在合作,这种叫做分布式,两个都在炒菜或者都在做菜,就叫做集群. eureka的是springCloud的注册中 ...
- springcloud 笔记
官方教程 http://projects.spring.io/spring-cloud/ guide https://github.com/spring-guides 伪官方教程 https://sp ...
- springcloud 笔记-服务注册中心
1.搭建springcloud服务注册中心需要添加eureka的依赖: <?xml version="1.0" encoding="UTF-8"?> ...
- SpringBoot+SpringCloud 笔记
SpringBoot总结 使用Typora打开https://pan.baidu.com/s/1tXS45j6ooXpnzhy1Zp78Gw 提取码: c8fi SpringCloud总结 使用XMi ...
随机推荐
- IDEA使用Maven搭建JavaWeb项目
1. 新建项目 2. 填写项目坐标信息 3. 手动生效pom.xml 4. 添加maven常用配置 1) 设置项目统一编码 <!-- 设置编码 --> <properties> ...
- SQL IN 运算符
SQL IN 运算符 IN运算符允许您在WHERE子句中指定多个值. IN运算符是多个OR条件的简写. SQL IN 语法 SELECT column_name(s) FROM table_name ...
- Antd Vue 问题集合
1.table列宽问题 在滚动列时,如果要指定列宽,不要指定所有列宽,至少预留一列不执行列宽. 同时:scroll="{ x: width}", width的值要是所有列的宽度之和 ...
- JavaScript 的 API设计原则
一.接口的流畅性 好的接口是流畅易懂的,他主要体现如下几个方面: 1.简单 操作某个元素的css属性,下面是原生的方法: document.querySelectorAll('#id').style. ...
- windows 配置msys2环境
msys2是一个在windows下模拟类unix的环境,之所以叫环境,是用为他提供了部分unix shell类似的功能,这个环境使你像在unix上使用shell一样.看到msys2你可能想到是不是还有 ...
- Java第四次作业,面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
- Python selenium web UI之Chrome 与 Chromedriver对应版本映射表及下载地址和配置(windows, Mac OS)
浏览器及驱动下载 进行web UI 自动化时,需要安装浏览器驱动webdriver,Chrome浏览器需要安装chromedriver.exe 驱动,Firefox需安装 geckodriver.ex ...
- UCML 原生Android中嵌入Cordova Webview
Android实现在当前进程打开网页可以将Cordova中的WebView嵌入Android项目中,实现简单,不需要自己实现,所以掌握如何嵌入WebView对项目快速开发很有帮助 官方也有这方面的教程 ...
- Kafka启动报错
文章目录 问题 解决 问题 通过 ./kafka-server-start.sh ../config/server.properties 启动kafka 之前在server.properties中修改 ...
- Codeforces 388C Fox and Card Game (贪心博弈)
Codeforces Round #228 (Div. 1) 题目链接:C. Fox and Card Game Fox Ciel is playing a card game with her fr ...