技术标签: spring cloud
学习spring cloud之前首先学习搭建spring boot框架 并且整合ssm框架,搭建一个demo
使用eclipse 建立spring boot工程
选择web 以及mybatiis/mysql
工程结构如图所示
建立models-》student.java
package com.example.demo.models;
public class Student {
private int id;
private String name;
private String sex;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
建立dao层中的studentMapper
package com.example.demo.dao;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import com.example.demo.models.Student;
@Repository
public interface StudentMapper {
@Select("SELECT * FROM student WHERE id=#{id}")
Student getStudentByID(int id);
}
以及controller层中的StudentController
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.dao.StudentMapper;
import com.example.demo.models.Student;
@RestController
public class StudentController {
@Autowired
private StudentMapper studentMapper;
@RequestMapping("/demo")
public Student get(){
Student student=studentMapper.getStudentByID(2);
return student;
}
@RequestMapping(value = "res")
public String df(){
return "Hello";
}
}
启动类:**Application
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@EnableTransactionManagement
@ComponentScan("com.example.demo.Controller")
@MapperScan("com.example.demo.Dao")
public class SpringBootSsmApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootSsmApplication.class, args);
}
}
配置文件application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/world
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.jdbc.Driver
mybatis.type-aliases-package=com.example.demo.models
pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>SpringBootSSM</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringBootSSM</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
项目可以启动 初步了解spring boot的搭建,springboot将大部分配置文件“约定好”,确实简化了开发。
之后开始了解springCloud的概念以及搭建:
1.1什么是分布式
不同模块部署在不同服务器上
作用:分布式解决网站高并发带来问题
1.2什么是集群
多台服务器部署相同应用构成一个集群
作用:通过负载均衡设备共同对外提供服务
1.3什么是RPC
RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。
它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。
比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决
1.3.1restful、soap、rpc
(1)RESTful是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 RESTful架构或服务。
(2)SOAP,简单对象访问协议是一种数据交换协议规范,
是一种轻量的、简单的、基于XML的协议的规范。SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的。
SOAP的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防火墙或代理服务器的要求。
soap可以使用任何语言来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台无需修改即可正常使用。
(3)RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
1.3.2rpc远程调用框架
几种比较典型的RPC的实现和调用框架。
(1)RMI实现,利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol)
和java的原生序列化。
(2)Hessian,是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。
(3)thrift是一种可伸缩的跨语言服务的软件框架。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
(4)SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。
1.4什么是SOA
业务系统分解为多个组件,让每个组件都独立提供离散,自治,可复用的服务能力
通过服务的组合和编排来实现上层的业务流程
作用:简化维护,降低整体风险,伸缩灵活
1.5什么是微服务
架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行
SOA到微服务架构的演进过程
作用:各服务可独立应用,组合服务也可系统应用(巨石应用[monolith]的简化实现策略-平台思想)
文章浏览阅读9.5k次,点赞3次,收藏6次。http://blog.csdn.net/wklken/article/details/7603071========================需求:在实际应用中,需要对xml配置文件进行实时修改, 1.增加、删除 某些节点 2.增加,删除,修改某个节点下的某些属性 3.增加,删除,修改某些节点的文本xml源文件格式[例][html] _etree结果集文本替换
文章浏览阅读1.2w次。1.出现场景:在idea中使用sbt构建工程时,_[error] [launcher] unresolved dependency: org.scala-sbt#sbt;1.3.8: not found
文章浏览阅读3.9k次。题目用HashMap模拟一个网上购物车。要求:从键盘输入n本书的名称、单价、购买数量,将这些信息存入一个HashMap,然后将该HashMap作为参数调用方法getSum(HashMap books),该方法用于计算书的总价并返回。【说明:键盘输入可使用Scanner类】答案import java.util.*;public class Shop { public st...
文章浏览阅读344次。神奇题目_bzoj1465: 糖果传递
文章浏览阅读3.5w次,点赞91次,收藏240次。文章目录前言一、Path 是什么?二、使用步骤1.提取文件名3. 提取父文件2.提取文件后缀2.更改文件后缀2.遍历文件组合文件路径总结前言一、Path 是什么?二、使用步骤1.提取文件名.name3. 提取父文件.parent2.提取文件后缀.suffix2.更改文件后缀.with_suffix2.遍历文件.iterdir()组合文件路径.joinpath总结..._python path stem
文章浏览阅读9.7k次,点赞19次,收藏55次。本文原理参考论文: Laplacian Mesh Processing本文复现参考:Mesh模型的Laplace Deformation(网格形变 - 拉普拉斯形变) - C++代码实现文章目录拉普拉斯网格变形原理拉普拉斯坐标拉普拉斯矩阵原理分析添加锚点求解形变后的坐标拉普拉斯网格变形是一个相当经典的工作,本工作复现了一下基础的部分,这里记录下原理部分和结果。复现结果演示如下:拉普..._拉普拉斯形变
文章浏览阅读1k次。帆软 substitute 用SUBSTITUTE计数单元格中的项目 (Count Items in a Cell with SUBSTITUTE) Do you use Excel's SUBSTITUTE function very often? It's a handy way to count items in a cell, when they're separated by comma..._帆软翻译公式
文章浏览阅读126次。这篇文章主要介绍了php使用GD创建保持宽高比缩略图的方法,涉及php使用GD库操作图片的技巧,需要的朋友可以参考下本文实例讲述了php使用GD创建保持宽高比缩略图的方法。具体如下:/*** Create a thumbnail image from $inputFileName no taller or wider than* $maxSize. Returns the new image re..._php gd 库如何将带有表情的问题画在图片上
文章浏览阅读7k次。使用Modal中的footer属性,如下:<Modaltitle="更改成员"visible={visible}confirmLoading={confirmLoading}onCancel={this.handleCancel}footer={[] // 设置footer为空,去掉 取消 确定默认按钮}></Modal>这样就去掉了确认和取消按钮 也可以自定义按钮。如下:<Modalvisible={visible}title="T._react的antui model去掉按钮
文章浏览阅读7.4k次。昨天,我的大学学习系列文章作者:曾毅 转载自:曾毅的主页 成文时间:2004年7月2000年9月5日我开始了大学生活,2004年7月7日我结束了4年的本科年华。时光日流水,人常说大学四年光阴是人生中最重要的四年,对于我来说这四年如此的漫长,但又如此短暂,似乎是一个结束,却又意味着一段更为令人激动的生活的开始。按照惯例,总要记些文字下来的。总结过去,给自己一个交待。展望未来,给自己一点希望。除了一个_我的大学学习 昨天
文章浏览阅读739次。部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCreate方法,我们可以在androidmanifest.xml中的activit元素加入这个属性Android:configChanges="orientation|keyboardHidden" 即可,比如Java代码/* 声明Display对象,以取得屏幕..._android 横竖屏切换不重新加载
文章浏览阅读967次。1:Consider defining a bean of type 'org.apache.kafka.clients.producer.Producer' in your configuration.是因为没有配置Kafka基础配置,解决方式