SpringCloud 入门
2018-06-14 07:00
399 查看
1. 入门概述
SpringBoot
专注于快速方便的开发单个个体微服务;SpringCloud
:关注全局的微服务协调治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
为各个微服务之间提供配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等等集成服务;
1.1 Dubbo和SpringCloud比较
- Dubbo服务调用方式:RPC
- SpringCloud服务调用方式:REST API
2. SpringCloud 之 Hello World
2.1 创建整体父工程Project(microservicecloud)
- 主要是定义POM文件,将后续各个子模块公用的jar包等统一提取出来,类似一个抽象父类;
// pom.xml <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.noodles.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <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> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.18</lombok.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.4</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</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> </project>
2.2 创建公共子模块Module(microservicecloud-api)
// pom.xml <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> <parent> <groupId>com.noodles.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-api</artifactId> <dependencies> <!-- 当前Module需要用到的jar包,按自己需要添加,如果父类已经包含了,可以不要写版本号 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project> // com.noodles.springcloud.entities @SuppressWarnings("serial") @AllArgsConstructor @NoArgsConstructor @Data @Accessors(chain=true) public class Dept implements Serializable{ private Long deptno; private String dname; // 来自哪个数据库,因为微服务架构可以一个服务对应一个数据库, // 同一个信息被存储到不同数据库 private String db_source; // 第一种方式: // 无参和全参构造函数 // getter,setter和toString 方法 // 第二种方式: 使用lombok,使用注解 // Eclipse 需要安装lombok插件 } // mvn clean install 后给其他模块引用,达到通用目的; // 即需要用到部门实体的话,不用每个工程都定义一份,直接引用本模块即可;
2.3 部门微服务提供者Module(microservicecloud-provider-dept-8001)
// pom.xml <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> <parent> <groupId>com.noodles.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-provider-dept-8001</artifactId> <dependencies> <dependency> <groupId>com.noodles.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <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> </dependencies> </project> // src/main/resources/application.yml server: port: 8081 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 type-aliases-package: com.noodles.springcloud.entities # 所有Entity别名类所在包 mapper-locations: - classpath:mybatis/mapper/**/*.xml spring: application: name: microservicecloud-dept datasource: type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包 url: jdbc:mysql://localhost:3306/cloudDB01 # 数据库名称 username: root password: root dbcp2: min-idle: 5 initial-size: 5 max-total: 5 max-wait-millis: 200 // src/main/sources/mybatis/mybatis.cfg.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="cacheEnabled" value="true"/> </settings> </configuration> // com.noodles.springcloud.dao @Mapper public interface DeptDao { public boolean addDept(Dept dept); public Dept findById(Long id); public List<Dept> findAll(); } // src/main/sources/mybatis/mapper/DeptMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.noodles.springcloud.dao.DeptDao"> <select id="findById" resultType="Dept" parameterType="Long"> select deptno,dname,db_source from dept where deptno=#{deptno}; </select> <select id="findAll" resultType="Dept"> select deptno,dname,db_source from dept; </select> <insert id="addDept" parameterType="Dept"> INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE()); </insert> </mapper> // DeptService部门服务接口 public interface DeptService { public boolean add(Dept dept); public Dept get(Long id); public List<Dept> list(); } // DeptServiceImpl部门服务接口实现类 @Service public class DeptServiceImpl implements DeptService{ @Autowired private DeptDao deptDao; @Override public boolean add(Dept dept) { return deptDao.addDept(dept); } @Override public Dept get(Long id) { return deptDao.findById(id); } @Override public List<Dept> list() { return dptDao.findAll(); } } //DeptController部门微服务提供者REST @RestController public class DeptController { @Autowired private DeptService deptService; @RequestMapping(value="/dept/add",method=RequestMethod.POST) public boolean add(@RequestBody Dept dept) { return deptService.add(dept); } @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET) public Dept get(@PathVariable("id") Long id) { return deptService.get(id); } @RequestMapping(value="/dept/list",method=RequestMethod.GET) public List<Dept> get() { return deptService.list(); } } // DeptProvider8001_App主动启动类DeptProvider8001_App @SpringBootApplication public class DeptProvider8001_App { public static void main(String[] args) { SpringApplication.run(DeptProvider8001_App.class, args); } }
2.4 部门微服务消费者Module(microservicecloud-consumer-dept-80)
// pom.xml <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> <parent> <groupId>com.noodles.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-consumer-dept-80</artifactId> <description>部门微服务消费者</description> <dependencies> <dependency> <groupId>com.noodles.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 修改后立即生效,热部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project> // application.yml server: port: 8082 // com.noodles.springcloud.cfgbeans // ConfigBean 类(作用类似Spring里面的applicationContext.xml写入的注入Bean) @Configuration public class ConfigBean{ @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } } // 新建DeptController_Consumer部门微服务消费者REST // com.noodles.springcloud.controller @RestController public class DeptController_Consumer { private static final String REST_URL_PREFIX = "http://localhost:8081"; /** * 使用restTemplate访问restful接口: * (url, requestMap, ResponseBean.class)这三个参数分别代表: * REST请求地址,请求参数,HTTP响应被转换成的对象类型 */ @Autowired private RestTemplate restTemplate; @RequestMapping(value="/consumer/dept/add") public boolean add(Dept dept) { return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class); } @RequestMapping(value="/consumer/dept/get/{id}") public Dept get(@PathVariable("id") Long id) { return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class); } @SuppressWarnings("unchecked") @RequestMapping(value="/consumer/dept/list") public List<Dept> list() { return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class); } } // com.noodles.springcloud // DeptConsumer80_App 主启动类 @SpringBootApplication public class DeptConsumer80_App { public static void main(String[] args) { SpringApplication.run(DeptConsumer80_App.class, args); } } // 测试: // 访问: // http://localhost:8082/consumer/dept/get/2 // http://localhost:8082/consumer/dept/list
参考资料:
相关文章推荐
- SpringCloud自学入门-服务发现与消费并实现负载均衡
- SpringCloud入门6:分布式配置中心(Spring Cloud Config)
- springcloud-sleuth+zipkin入门一
- SpringCloud 入门 | 服务的注册与发现之Eureka
- 【SpringCloud】(一):SpringCloud入门程序
- SpringCloud简单入门——写给自己
- SpringCloud入门之YAML格式文件规范学习
- springcloud 入门 4 (rebbon源码解读)
- springcloud入门之配置中心
- SpringCloud从入门到进阶(三)——路由接入Zuul
- SpringCloud入门1:服务的注册与发现(Eureka)
- SpringCloud入门教学|第四篇:断路器(Hystrix)
- springcloud入门之服务提供者client并注册到eureka
- SpringCloud 入门教程 | 第一篇: 服务的注册与发现(Eureka)
- SpringCloud入门教学|第二篇:服务消费者(restTempleate+ribbon)
- SpringCloud入门之常用的配置文件 application.yml和 bootstrap.yml区别
- SpringBoot,SpringCloud入门到精通最简单教程
- SpringCloud自学入门-RestTemplate的使用
- springcloud 入门 3 (服务之间的调用)
- springcloud入门之服务消费者(ribbon)