SpringCloud

文章目录

  • 微服务框架
    • 1 单体应用
      • 1.1 什么是单体应用
      • 1.2 单体应用的问题
    • 2 微服务架构
      • 2.1 什么是微服务架构
      • 2.2 微服务的优点
      • 2.3 微服务缺点
      • 2.4 SpringCloud简介
      • 2.5 SpringCloud和Dubbo的区别
    • 3 SpringCloud入门
      • 3.1 注册中心原理
      • 3.2 搭建注册中心
        • 3.2.1 创建多模块工程
        • 3.2.2 springcloud-parent管理依赖
        • 3.2.3 springcloud-eureka-server-1000导入依赖
        • 3.2.4 主配置类
        • 3.2.5 配置文件application.yml
      • 3.3 搭建提供者服务 springcloud-user-server-2000
        • 3.3.1 导入依赖
        • 3.3.2 创建配置类
        • 3.3.3 配置文件
      • 3.4 搭建消费者服务 springcloud-order-server-3000
        • 3.4.1 导入依赖
        • 3.4.2 创建配置类
        • 3.4.3 配置文件
      • 3.5 使用ip注册
    • 4 订单服务和用户服务完成通信
      • 4.1 搭建公共的用户模块
      • 4.2 user-server提供者服务编写接口
        • 4.2.1 依赖公共模块
        • 4.2.2 创建controller
      • 4.3 order-server消费者服务
        • 4.3.1 依赖公共模块
        • 4.3.2 定义RestTemplate的bean
        • 4.3.3 定义消费者的Controller
    • 5 EurekaServer高可用集群
      • 5.1 单节点故障
      • 5.2 EurekaServer集群
        • 5.2.1 原理图
        • 5.2.2 搭建EurekaServer集群
        • 5.2.3 修改EurekaClient (UserServer ,OrderServer)
    • 6 Ribbon
      • 6.1 集群和负载均衡原理
      • 6.2 提供者user-server集群
        • 6.2.1 创建user-server服务2001 - 赋值
        • 6.2.2 修改配置
        • 6.2.3 修改主类名,pom中的名字,parent中的模块增加
      • 6.3 order-server集成Ribbon
        • 6.3.1 导入依赖
        • 6.3.2 修改RestTemplate的Bean的定义
        • 6.3.3 修改Controller调用方式

微服务框架

1 单体应用

1.1 什么是单体应用

项目所有的资源都放在一个应用中,打包成一个war包,使用一个Tomcat运行,运行在一个进程中

1.2 单体应用的问题

  1. 一个模块挂了,所有的项目都受影响
  2. 单个Tomcat处理并发有限,可以做集群,但不方便其中某一个模块的扩展
  3. 维护、开发、升级等比较麻烦
  4. 代码臃肿,打包比较慢
  5. 技术选型单一
  6. 数据库选型单一

2 微服务架构

2.1 什么是微服务架构

  1. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值
  2. 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被技术选项,独立开发,独立部署,独立运维,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
  3. 微服务之间使用网络通信协议进行数据交互(通常是基于HTTP的RESTful API)

2.2 微服务的优点

  1. 数据库选型多样化
  2. 技术选型多样化
  3. 每个微服务专注于一个业务
  4. 每个微服务都有自己的进程
  5. 微服务之间通过网络协议进行通信
  6. 方便做局部拓展
  7. 维护、开发、升级等比较方便

2.3 微服务缺点

  1. 成本高
  2. 技术要求比较高
  3. 部署麻烦

SpringCloud_第1张图片

2.4 SpringCloud简介

SpringCloud是一个基于Spring Boot实现服务治理的工具包,用于微服务架构中管理和协调服务的

2.5 SpringCloud和Dubbo的区别

  • DubboRPC框架
  • SpringCloud是一系列微服务解决方案
  • Dubbo基于tcp
  • SpringCloud基于HTTP
  • Dubbo在通信方面的性能高于SpringCloud

3 SpringCloud入门

3.1 注册中心原理

SpringCloud_第2张图片

  1. 微服务启动时会把自己的通信地址(ip;端口;服务名字)注册到注册中心
  2. 微服务会从注册中心获取一份微服务通信地址清单
  3. 当服务发起调用,就会从服务地址清单中找到目标服务的通信地址,实现调用
  4. 注册中心能够使用心跳机制实现微服务的动态上下线,间隔单位时间检查微服务的健康状态,把下线的微服务从地址清单中剔除掉,其他为服务同步地址清单

3.2 搭建注册中心

3.2.1 创建多模块工程

springcloud-parent
  springcloud-eureka-server-1000 //注册中心EurekaServer 
  springcloud-order-server-3000  //订单服务EurekaClient ,消费者
  springcloud-user-server-2000   //用户服务EurekaClient ,提供者

3.2.2 springcloud-parent管理依赖

<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.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.0.5.RELEASEversion>
    parent>
    <groupId>cn.itsourcegroupId>
    <artifactId>springcloud-parent1artifactId>
    <packaging>pompackaging>
    <version>1.0-SNAPSHOTversion>
    <modules>
        <module>springcloud-eureka-server-1000module>
        <module>springcloud-user-server-2000module>
        <module>springcloud-order-server-3000module>
    modules>
    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <java.version>1.8java.version>
        <spring-cloud.version>Finchley.SR1spring-cloud.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
project>

3.2.3 springcloud-eureka-server-1000导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
dependencies>

3.2.4 主配置类

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication1000 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication1000.class);
    }
}

3.2.5 配置文件application.yml

server:
  port: 1000

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false #禁用注册中心向自己注册
    fetchRegistry: false #不让注册中心获取服务的注册列表
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      #注册中心的注册地址

3.3 搭建提供者服务 springcloud-user-server-2000

3.3.1 导入依赖

<dependencies>
   <dependency>
       <groupId>org.springframework.cloudgroupId>
       <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
   dependency>
   <dependency>
       <groupId>org.springframework.bootgroupId>
       <artifactId>spring-boot-starter-webartifactId>
   dependency>

dependencies>

3.3.2 创建配置类

//@EnableDiscoveryClient:开启注册中心客户端 EurekaClient
@SpringBootApplication
@EnableDiscoveryClient
public class UserServerApplication2000 {
    public static void main(String[] args) {
        SpringApplication.run(UserServerApplication2000.class);
    }
}

3.3.3 配置文件

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/ #注册中心地址
server:
  port: 2000
spring:
  application:
    name: user-server

3.4 搭建消费者服务 springcloud-order-server-3000

3.4.1 导入依赖

<dependencies>
   <dependency>
       <groupId>org.springframework.cloudgroupId>
       <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
   dependency>
   <dependency>
       <groupId>org.springframework.bootgroupId>
       <artifactId>spring-boot-starter-webartifactId>
   dependency>

dependencies>

3.4.2 创建配置类

@SpringBootApplication
@EnableDiscoveryClient
public class OrderServerApplication3000 {
    public static void main(String[] args) {
        SpringApplication.run(OrderServerApplication3000.class);
    }
}

3.4.3 配置文件

server:
  port: 3000
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/ #注册中心地址

spring:
  application:
    name: order-server

3.5 使用ip注册

修改用户服务和订单服务如下

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/ #注册中心地址
  instance:
    prefer-ip-address: true #使用ip地址注册
    instance-id: order-server  #指定服务的id

4 订单服务和用户服务完成通信

SpringCloud_第3张图片

4.1 搭建公共的用户模块

建立domain:user

4.2 user-server提供者服务编写接口

4.2.1 依赖公共模块

<dependency>
    <groupId>cn.itsourcegroupId>
    <artifactId>springcloud-common-userartifactId>
    <version>1.0-SNAPSHOTversion>
    <scope>compilescope>
dependency>

4.2.2 创建controller

/**
 * 用户服务提供者
 */
@RestController
public class UserProviderController {
    @Value("${server.port}")
    private String port;
    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable("id")Long id){
        return new User(id, "zs" + id, "123:" + port);
    }
}

4.3 order-server消费者服务

4.3.1 依赖公共模块

<dependency>
    <groupId>cn.itsourcegroupId>
    <artifactId>springcloud-common-userartifactId>
    <version>1.0-SNAPSHOTversion>
    <scope>compilescope>
dependency>

4.3.2 定义RestTemplate的bean

/**
 * SpringMvc提供的一个基于Rest风格的http调用工具
 * @return
 */
@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

4.3.3 定义消费者的Controller

/**
 * 订单消费者服务
 */
@RestController
public class OrderConsumerController {
    @Autowired
    private RestTemplate restTemplate ;
    /**
     * 该方法是浏览器来调用
     * @param id
     * @return
     */
    @GetMapping("/order/user/{id}")
    public User getUserById(@PathVariable("id") Long id){
        System.out.println("OrderConsumerController.getUserById被调用了......");
        String url = "http://localhost:2000/user/"+id;
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }
}

5 EurekaServer高可用集群

5.1 单节点故障

什么是EurekaServer单节点故障

如果只有一个EurekaSever,如果EurekaSever挂了那么整个微服务都不可用

解决方案

EurekaServer高可用集群

5.2 EurekaServer集群

5.2.1 原理图

SpringCloud_第4张图片

5.2.2 搭建EurekaServer集群

  • 创建两个本地域名 C:\Windows\System32\drivers\etc\hosts
    127.0.0.1 peer1
    127.0.0.1 peer2
  • 修改注册中心eureka-server-1000
server:
  port: 1000
eureka:
  instance:
    hostname: peer1
  client:
    registerWithEureka: false #禁用注册中心向自己注册
    fetchRegistry: false  #不让注册中心获取服务的注册列表
    serviceUrl:
      defaultZone: http://peer2:1001/eureka/
      #注册中心的注册地址 ,其他微服务需要向这个地址注册
  • 搭建第二个注册中心eureka-server-1001
server:
  port: 1001
eureka:
  instance:
    hostname: peer2
  client:
    registerWithEureka: false #禁用注册中心向自己注册
    fetchRegistry: false  #不让注册中心获取服务的注册列表
    serviceUrl:
      defaultZone: http://peer1:1000/eureka/
      #注册中心的注册地址 ,其他微服务需要向这个地址注册

5.2.3 修改EurekaClient (UserServer ,OrderServer)

eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/ #注册中心地址
      ...

6 Ribbon

ribbon是负载均衡器,是基于RestTemplate ,它赋予了RestTemplate 负载均衡的能力

6.1 集群和负载均衡原理

SpringCloud_第5张图片

6.2 提供者user-server集群

6.2.1 创建user-server服务2001 - 赋值

6.2.2 修改配置

eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/ #注册中心地址
  instance:
    prefer-ip-address: true #使用ip地址注册
    instance-id: user-server1  #指定服务的id
server:
  port: 2000 
spring:
  application:
    name: user-server

6.2.3 修改主类名,pom中的名字,parent中的模块增加

6.3 order-server集成Ribbon

6.3.1 导入依赖

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-ribbonartifactId>
dependency>

6.3.2 修改RestTemplate的Bean的定义

/**
 * SpringMvc提供的一个基于Rest风格的http调用工具
 * @LoadBalanced :ribbon的负载均衡标签,赋予RestTemplate有负债均衡的能力
 */
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return new RestTemplate();
}

@LoadBalancedribbon的负载均衡标签,赋予RestTemplate有负债均衡的能力

6.3.3 修改Controller调用方式

@GetMapping("/order/user/{id}")
public User getUserById(@PathVariable("id") Long id){
    System.out.println("OrderConsumerController.getUserById被调用了......");
    //String url = "http://localhost:2000/user/"+id;
    String url = "http://user-server/user/"+id;
    User user = restTemplate.getForObject(url, User.class);
    return user;
}

修改效果: String url = "http://user-server/user/"+id;
ribbon默认使用的轮询策略

你可能感兴趣的:(java,SpringCloud,学习)