SpringCloud
一丶 系统架构
-
集中式架构:一台服务器,容错率比较低
-
垂直拆分架构:代码重用率低
-
分布式服务:调用错综复杂
-
SOA:面向服务架构,SOA使用了ESB组件的面向服务架构:ESB自身实现复杂;应用服务粒度较大,所有服务之间的通信都经过ESB会降低通信速度;部署、测试ESB比较麻烦。
-
微服务架构:是一套使用小服务或者单一业务来开发单个应用的方式或途径。
- 单一职责
- 服务粒度小
- 面向服务(对外暴露REST api)
- 服务之间相互独立
- 与使用ESB的SOA架构的区别:微服务架构没有使用ESB,有服务治理注册中心;业务粒度小。
二丶服务调用方式
- RPC:基于socket,速度快,效率高;webservice、dubbo
- HTTP:基于TCP,封装比较臃肿;对服务和调用方没有任何技术、语言的限定,自由灵活;RESTful,Spring Cloud
三丶RestTemplate示例工程
-
一般情况下有三种http客户端工具类包都可以方便的进行http服务调用
- httoClient
- okHttp
- JDK原生URLConnection
-
spring 提供了RestTemplate的工具类对上述的3种http客户端工具类进行了封装,可在spring项目中使用RestTemplate进行服务调用。
@RunWith(SpringRunner.class) @SpringBootTest public class RestTemplateTest { @Autowired private RestTemplate restTemplate; @Test public void test(){ String url = "http://localhost/user/8"; //restTemplate可以对json格式字符串进行反序列化 User user = restTemplate.getForObject(url, User.class); System.out.println(user); } }
四丶SpringCloud概述
- 整合的组件可以有很多组件;常见的组件有:eureka注册中心,Gateway网关,Ribbon负载均衡,Feign服务调用,Hystrix熔断器。在有需要的时候项目添加对于的启动器依赖即可。
- 版本特征:以英文单词命名(伦敦地铁站名)最新稳定版本GreenWich 格林威治
五丶创建微服务工程
创建微服务父工程springcloud、用户服务工程user-service、服务消费工程consumer-demo
需求:查询数据库中的用户数据并输出到浏览器
- 父工程heima-springcloud:添加spring boot父坐标和管理其它组件的依赖
- 用户服务工程user-service:整合mybatis查询数据库中用户数据;提供查询用户服务
- 服务消费工程consumer-demo:利用查询用户服务获取用户数据并输出到浏览器
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<mapper.starter.version>2.1.5</mapper.starter.version>
<mysql.version>5.1.46</mysql.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 通用Mapper启动器 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper.starter.version}</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
通过 scope
的import可以继承 spring-cloud-dependencies
工程中的依赖
六丶搭建配置user-service工程
-
添加启动器依赖(web、通用Mapper);
-
可以访问http://localhost:9091/user/8输出用户数据
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 通用Mapper启动器 --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> </dependency> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
-
创建启动引导类和配置文件;
server: port: 9091 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/springcloud username: root password: root mybatis: type-aliases-package: com.itheima.user.pojo
-
修改配置文件中的参数;
-
编写测试代码(UserMapper,UserService,UserController);
-
测试
七丶搭建配置consumer-demo工程
编写测试类使用restTemplate访问user-service的路径根据id查询用户,:访问http://localhost:8080/consumer/8 使用RestTemplate获取http://localhost:9091/user/8的数据
-
添加启动器依赖;
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
创建启动引导类(注册RestTemplate)和配置文件;
-
编写测试代码(ConsumerController中使用restTemplate访问服务获取数据)
public class ConsumerController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @GetMapping("/{id}") //@HystrixCommand(fallbackMethod = "queryByIdFallback") @HystrixCommand public String queryById(@PathVariable Long id){ if (id == 1) { throw new RuntimeException("太忙了"); } /*String url = "http://localhost:9091/user/"+id; //获取eureka中注册的user-service的实例 List<ServiceInstance> serviceInstances = discoveryClient.getInstances("user-service"); ServiceInstance serviceInstance = serviceInstances.get(0); url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/user/" + id;*/ String url = "http://user-service/user/" + id; return restTemplate.getForObject(url, String.class); }
-
测试
小结测试反思出的问题:
- 服务管理
如何自动注册和发现
如何实现状态监管
如何实现动态路由 - 服务如何实现负载均衡
- 服务如何解决容灾问题
- 服务如何实现统一配置
上述的问题都可以通过Spring Cloud的各种组件解决,可通过查看继续更新