这里写目录标题
一级目录
二级目录
三级目录
1、单应用架构
早期的系统大部分都是单应用架构,所有的模块集成在一个应用里面,只需要一台应用服务器和一台数据库服务器,随着访问量的增加,服务器负载的慢慢提高,解决性能瓶颈的方案是不断提高服务器的配置。
2、应用服务器集群
随着访问量的继续增加,单台应用服务器已经无法满足需求,假设我们的数据库服务器还没遇到性能问题,我们可以通过增加应用服务器的方式来将应用服务器集群化,这样用户可以分流到各个应用服务器中,从而达到提升系统负载能力的目的。
但是应用服务器集群会带来的问题:
用户请求如何分流到各个应用服务器?
用户如果的两次请求被分配到不同的服务器,如果做到session共享?
为了解决第1个问题,需要在用户请求和应用服务器中间增加负载均衡,负载均衡分硬负载和软负载,硬负载可以选择F5等,软负载可以选择nginx、Apache等,增加了负载均衡后系统架构便变成下面这样。
而第2个关于session共享问题,我们可以通过配置tomcat的session共享或者缓存服务器来实现。
3、数据库读写分离
应用服务器集群提升了应用层的负载能力,但是数据库的负载能力并没有得到提升,那如何去提高数据库的负载能力呢?是不是也能参照应用服务器集群的方式,通过增加数据库服务器来实现呢?数据库读写分离被提了出来:
同样读写分离也会带来新的问题:
主库如何及时将数据同步到读库
应用服务器如何知道要调用哪个数据源
针对第1个问题,各数据库都提供了主从复制的解决方案,如mysql自带master-slave方式实现主从复制。
针对第2个问题,可以使用多数据源或者引入第三方数据库中间件,例如mycat。
4、缓存技术引入
随着访问量的持续增加,会出现许多用户访问统一内容的情况,对于这些数据,没必要每次都去数据库获取,这个时候引入应用层的缓存技术是个很好的选择,例如redis、memcache等。
5、应用拆分
随着业务的继续发展,应用的压力再次增大,同时不断增加的模块使系统变得越来越臃肿,维护工作量也越来越大。这个时候就可以考虑将应用系统进行拆分,按照领域模型拆分成多个子系统。
应用拆分后会带来新的问题,如子系统一中的一个查询在子系统二中也需要查询,是不是这些查询在两个子系统中都分别写一套呢?当然是不行的,一定要把这些抽象出来做成一个服务,这样又生成一个新的问题,多个子系统之间怎么相互访问呢?为了解决这个问题,RPC技术是个很好的选择,比较典型的有:dubbo、webservice、hessian、http、rmi等。
6、数据库垂直拆分
同样的,应用层面性能瓶颈解决后,又轮到数据库了,我们能将应用按照领域模型拆分成一个个应用子系统,数据库也是一样,根据不同的业务拆分成不用的数据库。拆分后数据库可以和拆分后的应用一一对应。
7、数据库水平拆分
数据库进行读写分离、垂直拆分后基本上解决了负载的问题,但是随着业务量的增加,表的数据不断增长,数据查询性能便成了问题,所以必须要多数据库进行水平拆分。水平拆分是将单个表的数据拆分到多个数据库中,如1亿数据的表拆分到10个数据库后,每个表就只有1000w了。
数据库水平拆分后,数据源就变得非常复杂了,让业务系统去控制查询哪个数据源变得不现实,这个时候需要引入第三方的数据库中间件,例如mycat、阿里的drds等。
最后演变出来的便是上图这个相对比较全的分布式架构了,但并不是说最后这个分布式架构一定是最优解决方案,具体选择哪个架构还是要结合业务系统的业务需求和业务量来分析
8 一个典型的分布式系统架构
二 一个简单微服务的架构(不使用SpringCloud微服务容器)
1父模块负责统一pom版本号
2一个公共的服务模块commonApi,负责提供共有的资源,例如实体类Bean
3一个生产者模块 provider,负责为消费者提供服务
4一个消费者模块 consumer,负责消费生产者提供的服务和接收用户的请求
三父模块(只关注pom)
<?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>org.example</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>commonApi</module>
<module>provider</module>
<module>consumer</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
四 公共模块commonApi
1pom
<?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">
<parent>
<artifactId>springcloud</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>commonApi</artifactId>
</project>
2实体类
package fengbo.entity;
import java.io.Serializable;
/**
* Created by @author LiuChunhang on 2020/7/14.
*/
public class Account implements Serializable {
private Integer id;
private String account;
private String password;
private String enterprise;
private String phone;
private String mail;
private int status;
public Account() {
}
public Account(Integer id, String account, String password, String enterprise, String phone, String mail, int status) {
this.id = id;
this.account = account;
this.password = password;
this.enterprise = enterprise;
this.phone = phone;
this.mail = mail;
this.status = status;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account == null ? null : account.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public String getEnterprise() {
return enterprise;
}
public void setEnterprise(String enterprise) {
this.enterprise = enterprise == null ? null : enterprise.trim();
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone == null ? null : phone.trim();
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail == null ? null : mail.trim();
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", account='" + account + '\'' +
", password='" + password + '\'' +
", enterprise='" + enterprise + '\'' +
", phone='" + phone + '\'' +
", mail='" + mail + '\'' +
", status=" + status +
'}';
}
}
package fengbo.entity;
import java.util.ArrayList;
import java.util.List;
public class AccountExample {
protected String orderByClause;
protected boolean distinct;
protected List<Criteria> oredCriteria;
public AccountExample() {
oredCriteria = new ArrayList<>();
}
public void setOrderByClause(String orderByClause) {
this.orderByClause = orderByClause;
}
public String getOrderByClause() {
return orderByClause;
}
public void setDistinct(boolean distinct) {
this.distinct = distinct;
}
public boolean isDistinct() {
return distinct;
}
public List<Criteria> getOredCriteria() {
return oredCriteria;
}
public void or(Criteria criteria) {
oredCriteria.add(criteria);
}
public Criteria or() {
Criteria criteria = createCriteriaInternal();
oredCriteria.add(criteria);
return criteria;
}
public Criteria createCriteria() {
Criteria criteria = createCriteriaInternal();
if (oredCriteria.size() == 0) {
oredCriteria.add(criteria);
}
return criteria;
}
protected Criteria createCriteriaInternal() {
Criteria criteria = new Criteria();
return criteria;
}
public void clear() {
oredCriteria.clear();
orderByClause = null;
distinct = false;
}
protected abstract static class GeneratedCriteria {
protected List<Criterion> criteria;
protected GeneratedCriteria() {
super();
criteria = new ArrayList<>();
}
public boolean isValid() {
return criteria.size() > 0;
}
public List<Criterion> getAllCriteria() {
return criteria;
}
public List<Criterion> getCriteria() {
return criteria;
}
protected void addCriterion(String condition) {
if (condition == null) {
throw new RuntimeException("Value for condition cannot be null");
}
criteria.add(new Criterion(condition));
}
protected void addCriterion(String condition, Object value, String property) {
if (value == null) {
throw new RuntimeException("Value for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value));
}
protected void addCriterion(String condition, Object value1, Object value2, String property) {
if (value1 == null || value2 == null) {
throw new RuntimeException("Between values for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value1, value2));
}
public Criteria andIdIsNull() {
addCriterion("Id is null");
return (Criteria) this;
}
public Criteria andIdIsNotNull() {
addCriterion("Id is not null");
return (Criteria) this;
}
public Criteria andIdEqualTo(Integer value) {
addCriterion("Id =", value, "id");
return (Criteria) this;
}
public Criteria andIdNotEqualTo(Integer value) {
addCriterion("Id <>", value, "id");
return (Criteria) this;
}
public Criteria andIdGreaterThan(Integer value) {
addCriterion("Id >", value, "id");
return (Criteria) this;
}
public Criteria andIdGreaterThanOrEqualTo(Integer value) {
addCriterion("Id >=", value, "id");
return (Criteria) this;
}
public Criteria andIdLessThan(Integer value) {
addCriterion("Id <", value, "id");
return (Criteria) this;
}
public Criteria andIdLessThanOrEqualTo(Integer value) {
addCriterion("Id <=", value, "id");
return (Criteria) this;
}
public Criteria andIdIn(List<Integer> values) {
addCriterion("Id in", values, "id");
return (Criteria) this;
}
public Criteria andIdNotIn(List<Integer> values) {
addCriterion("Id not in", values, "id");
return (Criteria) this;
}
public Criteria andIdBetween(Integer value1, Integer value2) {
addCriterion("Id between", value1, value2, "id");
return (Criteria) this;
}
public Criteria andIdNotBetween(Integer value1, Integer value2) {
addCriterion("Id not between", value1, value2, "id");
return (Criteria) this;
}
public Criteria andAccountIsNull() {
addCriterion("account is null");
return (Criteria) this;
}
public Criteria andAccountIsNotNull() {
addCriterion("account is not null");
return (Criteria) this;
}
public Criteria andAccountEqualTo(String value) {
addCriterion("account =", value, "account");
return (Criteria) this;
}
public Criteria andAccountNotEqualTo(String value) {
addCriterion("account <>", value, "account");
return (Criteria) this;
}
public Criteria andAccountGreaterThan(String value) {
addCriterion("account >", value, "account");
return (Criteria) this;
}
public Criteria andAccountGreaterThanOrEqualTo(String value) {
addCriterion("account >=", value, "account");
return (Criteria) this;
}
public Criteria andAccountLessThan(String value) {
addCriterion("account <", value, "account");
return (Criteria) this;
}
public Criteria andAccountLessThanOrEqualTo(String value) {
addCriterion("account <=", value, "account");
return (Criteria) this;
}
public Criteria andAccountLike(String value) {
addCriterion("account like", value, "account");
return (Criteria) this;
}
public Criteria andAccountNotLike(String value) {
addCriterion("account not like", value, "account");
return (Criteria) this;
}
public Criteria andAccountIn(List<String> values) {
addCriterion("account in", values, "account");
return (Criteria) this;
}
public Criteria andAccountNotIn(List<String> values) {
addCriterion("account not in", values, "account");
return (Criteria) this;
}
public Criteria andAccountBetween(String value1, String value2) {
addCriterion("account between", value1, value2, "account");
return (Criteria) this;
}
public Criteria andAccountNotBetween(String value1, String value2) {
addCriterion("account not between", value1, value2, "account");
return (Criteria) this;
}
public Criteria andPasswordIsNull() {
addCriterion("password is null");
return (Criteria) this;
}
public Criteria andPasswordIsNotNull() {
addCriterion("password is not null");
return (Criteria) this;
}
public Criteria andPasswordEqualTo(String value) {
addCriterion("password =", value, "password");
return (Criteria) this;
}
public Criteria andPasswordNotEqualTo(String value) {
addCriterion("password <>", value, "password");
return (Criteria) this;
}
public Criteria andPasswordGreaterThan(String value) {
addCriterion("password >", value, "password");
return (Criteria) this;
}
public Criteria andPasswordGreaterThanOrEqualTo(String value) {
addCriterion("password >=", value, "password");
return (Criteria) this;
}
public Criteria andPasswordLessThan(String value) {
addCriterion("password <", value, "password");
return (Criteria) this;
}
public Criteria andPasswordLessThanOrEqualTo(String value) {
addCriterion("password <=", value, "password");
return (Criteria) this;
}
public Criteria andPasswordLike(String value) {
addCriterion("password like", value, "password");
return (Criteria) this;
}
public Criteria andPasswordNotLike(String value) {
addCriterion("password not like", value, "password");
return (Criteria) this;
}
public Criteria andPasswordIn(List<String> values) {
addCriterion("password in", values, "password");
return (Criteria) this;
}
public Criteria andPasswordNotIn(List<String> values) {
addCriterion("password not in", values, "password");
return (Criteria) this;
}
public Criteria andPasswordBetween(String value1, String value2) {
addCriterion("password between", value1, value2, "password");
return (Criteria) this;
}
public Criteria andPasswordNotBetween(String value1, String value2) {
addCriterion("password not between", value1, value2, "password");
return (Criteria) this;
}
public Criteria andEnterpriseIsNull() {
addCriterion("enterprise is null");
return (Criteria) this;
}
public Criteria andEnterpriseIsNotNull() {
addCriterion("enterprise is not null");
return (Criteria) this;
}
public Criteria andEnterpriseEqualTo(String value) {
addCriterion("enterprise =", value, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseNotEqualTo(String value) {
addCriterion("enterprise <>", value, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseGreaterThan(String value) {
addCriterion("enterprise >", value, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseGreaterThanOrEqualTo(String value) {
addCriterion("enterprise >=", value, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseLessThan(String value) {
addCriterion("enterprise <", value, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseLessThanOrEqualTo(String value) {
addCriterion("enterprise <=", value, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseLike(String value) {
addCriterion("enterprise like", value, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseNotLike(String value) {
addCriterion("enterprise not like", value, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseIn(List<String> values) {
addCriterion("enterprise in", values, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseNotIn(List<String> values) {
addCriterion("enterprise not in", values, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseBetween(String value1, String value2) {
addCriterion("enterprise between", value1, value2, "enterprise");
return (Criteria) this;
}
public Criteria andEnterpriseNotBetween(String value1, String value2) {
addCriterion("enterprise not between", value1, value2, "enterprise");
return (Criteria) this;
}
public Criteria andPhoneIsNull() {
addCriterion("phone is null");
return (Criteria) this;
}
public Criteria andPhoneIsNotNull() {
addCriterion("phone is not null");
return (Criteria) this;
}
public Criteria andPhoneEqualTo(String value) {
addCriterion("phone =", value, "phone");
return (Criteria) this;
}
public Criteria andPhoneNotEqualTo(String value) {
addCriterion("phone <>", value, "phone");
return (Criteria) this;
}
public Criteria andPhoneGreaterThan(String value) {
addCriterion("phone >", value, "phone");
return (Criteria) this;
}
public Criteria andPhoneGreaterThanOrEqualTo(String value) {
addCriterion("phone >=", value, "phone");
return (Criteria) this;
}
public Criteria andPhoneLessThan(String value) {
addCriterion("phone <", value, "phone");
return (Criteria) this;
}
public Criteria andPhoneLessThanOrEqualTo(String value) {
addCriterion("phone <=", value, "phone");
return (Criteria) this;
}
public Criteria andPhoneLike(String value) {
addCriterion("phone like", value, "phone");
return (Criteria) this;
}
public Criteria andPhoneNotLike(String value) {
addCriterion("phone not like", value, "phone");
return (Criteria) this;
}
public Criteria andPhoneIn(List<String> values) {
addCriterion("phone in", values, "phone");
return (Criteria) this;
}
public Criteria andPhoneNotIn(List<String> values) {
addCriterion("phone not in", values, "phone");
return (Criteria) this;
}
public Criteria andPhoneBetween(String value1, String value2) {
addCriterion("phone between", value1, value2, "phone");
return (Criteria) this;
}
public Criteria andPhoneNotBetween(String value1, String value2) {
addCriterion("phone not between", value1, value2, "phone");
return (Criteria) this;
}
public Criteria andMailIsNull() {
addCriterion("mail is null");
return (Criteria) this;
}
public Criteria andMailIsNotNull() {
addCriterion("mail is not null");
return (Criteria) this;
}
public Criteria andMailEqualTo(String value) {
addCriterion("mail =", value, "mail");
return (Criteria) this;
}
public Criteria andMailNotEqualTo(String value) {
addCriterion("mail <>", value, "mail");
return (Criteria) this;
}
public Criteria andMailGreaterThan(String value) {
addCriterion("mail >", value, "mail");
return (Criteria) this;
}
public Criteria andMailGreaterThanOrEqualTo(String value) {
addCriterion("mail >=", value, "mail");
return (Criteria) this;
}
public Criteria andMailLessThan(String value) {
addCriterion("mail <", value, "mail");
return (Criteria) this;
}
public Criteria andMailLessThanOrEqualTo(String value) {
addCriterion("mail <=", value, "mail");
return (Criteria) this;
}
public Criteria andMailLike(String value) {
addCriterion("mail like", value, "mail");
return (Criteria) this;
}
public Criteria andMailNotLike(String value) {
addCriterion("mail not like", value, "mail");
return (Criteria) this;
}
public Criteria andMailIn(List<String> values) {
addCriterion("mail in", values, "mail");
return (Criteria) this;
}
public Criteria andMailNotIn(List<String> values) {
addCriterion("mail not in", values, "mail");
return (Criteria) this;
}
public Criteria andMailBetween(String value1, String value2) {
addCriterion("mail between", value1, value2, "mail");
return (Criteria) this;
}
public Criteria andMailNotBetween(String value1, String value2) {
addCriterion("mail not between", value1, value2, "mail");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {
protected Criteria() {
super();
}
}
public static class Criterion {
private String condition;
private Object value;
private Object secondValue;
private boolean noValue;
private boolean singleValue;
private boolean betweenValue;
private boolean listValue;
private String typeHandler;
public String getCondition() {
return condition;
}
public Object getValue() {
return value;
}
public Object getSecondValue() {
return secondValue;
}
public boolean isNoValue() {
return noValue;
}
public boolean isSingleValue() {
return singleValue;
}
public boolean isBetweenValue() {
return betweenValue;
}
public boolean isListValue() {
return listValue;
}
public String getTypeHandler() {
return typeHandler;
}
protected Criterion(String condition) {
super();
this.condition = condition;
this.typeHandler = null;
this.noValue = true;
}
protected Criterion(String condition, Object value, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.typeHandler = typeHandler;
if (value instanceof List<?>) {
this.listValue = true;
} else {
this.singleValue = true;
}
}
protected Criterion(String condition, Object value) {
this(condition, value, null);
}
protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.secondValue = secondValue;
this.typeHandler = typeHandler;
this.betweenValue = true;
}
protected Criterion(String condition, Object value, Object secondValue) {
this(condition, value, secondValue, null);
}
}
}
五 服务生产者(提供者)
1pom
<?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">
<parent>
<artifactId>springcloud</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
<dependencies>
<dependency>
<artifactId>commonApi</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--阿里数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
</project>
2配置文件
liru例如
application.properties
#服务器端口
server.port=8001
#配置Mybatis
mybatis.config-location=classpath:mybatisConfig.xml
mybatis.mapper-locations=classpath:mapper/*.xml
#配置数据源bean
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=shuang666
spring.datasource.url=jdbc:mysql://49.235.16.100:3306/springcloud1
spring.datasource.dbcp2.min-idle=5
spring.datasource.dbcp2.initial-size=5
spring.datasource.dbcp2.max-idle=5
spring.datasource.dbcp2.max-wait-millis=200
#配置内置日志logback
logging.config=classpath:logback.xml
#配置单文件上传最大值,#配置多文件请求上传最大值
spring.servlet.multipart.max-file-size=6MB
spring.servlet.multipart.max-request-size=66MB
#分页插件配置,#指定数据库,#分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,#支持通过 Mapper 接口参数来传递分页参数,默认值false
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
3 controller,service,dao
package fengbo.controller;
import fengbo.entity.Account;
import fengbo.service.ProviderServiceInterFace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* Created by @author LiuChunhang on 2020/7/15.
*/
@Controller
public class ProviderController {
@Autowired
public ProviderServiceInterFace providerServiceInterFace;
public ProviderServiceInterFace getProviderServiceInterFace() {
return providerServiceInterFace;
}
public void setProviderServiceInterFace(ProviderServiceInterFace providerServiceInterFace) {
this.providerServiceInterFace = providerServiceInterFace;
}
@ResponseBody
@RequestMapping(value = "login", method = {RequestMethod.POST, RequestMethod.GET})
public List<Account> fengbo(){
List<Account> validate = providerServiceInterFace.validate("yangshuang");
for (Account account:validate){
System.out.println(account);
}
return validate;
}
}
package fengbo.service;
import fengbo.entity.Account;
import java.util.List;
/**
* Created by @author LiuChunhang on 2020/7/14.
*/
public interface ProviderServiceInterFace {
//插入成功并查询的业务
public int register(Account account);
// 验证查库
public List validate(String string);
}
package fengbo.service;
import fengbo.dao.AccountMapper;
import fengbo.entity.Account;
import fengbo.entity.AccountExample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* Created by @author LiuChunhang on 2020/7/15.
*/
@Service
public class ProviderService implements ProviderServiceInterFace {
@Autowired
public AccountMapper accountMapper;
public AccountMapper getAccountMapper() {
return accountMapper;
}
public void setAccountMapper(AccountMapper accountMapper) {
this.accountMapper = accountMapper;
}
@Override
@Transactional
public int register(Account account) {
int insert = accountMapper.insert(account);
return insert;
}
@Override
@Transactional
public List validate(String string) {
AccountExample accountExample = new AccountExample();
AccountExample.Criteria criteria = accountExample.createCriteria();
criteria.andAccountEqualTo(string);
List<Account> accounts = accountMapper.selectByExample(accountExample);
return accounts;
}
}
/*@author*/
package fengbo.dao;
import fengbo.entity.Account;
import fengbo.entity.AccountExample;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface AccountMapper {
long countByExample(AccountExample example);
int deleteByExample(AccountExample example);
int deleteByPrimaryKey(Integer id);
int insert(Account record);
int insertSelective(Account record);
List<Account> selectByExample(AccountExample example);
Account selectByPrimaryKey(Integer id);
int updateByExampleSelective(@Param("record") Account record, @Param("example") AccountExample example);
int updateByExample(@Param("record") Account record, @Param("example") AccountExample example);
int updateByPrimaryKeySelective(Account record);
int updateByPrimaryKey(Account record);
}
4 启动类
package fengbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* Created by @author LiuChunhang on 2020/7/14.
*/
@MapperScan(basePackages = "fengbo.dao")
@EnableTransactionManagement
@SpringBootApplication
public class ProviderApp {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ProviderApp.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);
}
}
六服务消费者
1pom
<?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">
<parent>
<artifactId>springcloud</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consumer</artifactId>
<dependencies>
<dependency>
<artifactId>commonApi</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
2配置文件
application.properies
server.port=8002 server.servlet.path=/
3controller层和配置层和启动类
package fengbo.controller;
import fengbo.entity.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
* Created by @author LiuChunhang on 2020/7/15.
*/
@RestController
public class ConsumerController {
private static final String url="http://localhost:8001/login";
@Autowired
public RestTemplate restTemplate;
public RestTemplate getRestTemplate() {
return restTemplate;
}
public void setRestTemplate(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@RequestMapping(value = "consumer" , method = {RequestMethod.POST, RequestMethod.GET})
public List<Account> fengbo(){
return restTemplate.getForObject(url, List.class);
}
}
package fengbo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* Created by @author LiuChunhang on 2020/7/15.
*/
@Configuration
public class RESTtemplete {
/*创建resttemplate对象,用于发送rest请给另一个服务求*/
@Bean
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
}
package fengbo;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Created by @author LiuChunhang on 2020/7/15.
*/
@SpringBootApplication
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsumerApp.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);
}
}