SpringCloud

微服务框架

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. 部署麻烦

在这里插入图片描述

2.4 SpringCloud简介

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

2.5 SpringCloud和Dubbo的区别

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

3 SpringCloud入门

3.1 注册中心原理

在这里插入图片描述

  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.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>
    <groupId>cn.itsource</groupId>
    <artifactId>springcloud-parent1</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>springcloud-eureka-server-1000</module>
        <module>springcloud-user-server-2000</module>
        <module>springcloud-order-server-3000</module>
    </modules>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
3.2.3 springcloud-eureka-server-1000导入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </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.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </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.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </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 订单服务和用户服务完成通信

在这里插入图片描述

4.1 搭建公共的用户模块

建立domain:user

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

4.2.1 依赖公共模块
<dependency>
    <groupId>cn.itsource</groupId>
    <artifactId>springcloud-common-user</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</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.itsource</groupId>
    <artifactId>springcloud-common-user</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</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 原理图

在这里插入图片描述

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 集群和负载均衡原理

在这里插入图片描述

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.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</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默认使用的轮询策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值