SpringCloud笔记 - Day1 概念&注册中心&负载均衡

https://www.bilibili.com/video/BV1LQ4y127n4

1. 微服务导学

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第1张图片

异步通信可以大大提高服务的并发。
服务的异常定位:

  • 分布式日志服务
  • 系统监控和链路追踪

自动化部署:Jenkins——docker——k8s——RANCHER 持续集成

2. 微服务导学2

微服务治理、异步通信技术、缓存技术、DevOps、搜索技术
SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第2张图片

3. 微服务架构演变

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第3张图片

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第4张图片

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第5张图片

微服务:

  • 单一职责:微服务拆分粒度更小,每个服务对应唯一业务能力
  • 面向服务:微服务对外暴露业务接口
  • 自治:团队独立、技术独立、数据对立(可以有自己的数据库,数据的解耦)、部署独立
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

总结:
单体架构:简单方便、高度耦合、扩展性差、适合小项目
分布式架构:松耦合,扩展性好,但是架构复杂,难度大。适合大型互联网项目
微服务:一种良好的分布式架构方案

  • 优点:拆分力度更小、服务更独立、耦合度更低
  • 缺点:架构非常复杂,运维监控、部署难度高

4. 微服务技术对比

SpringCloud、Dubbo
SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第6张图片

Dubbo的核心是 服务远程调用,专门定义了 Dubbo协议(出的比较早,不是一套完整的微服务结构,非常不完善)
SpringCloud是整合,集大成者,直接采用了基于http的协议。提供了专门的配置中心和网关(SpringCloudGateway 比较受欢迎,原因是支持了响应式编程),Hystrix 功能也十分强大。
SpringCloudAlibaba,实现了SpringCloud得到标准接口。(甚至兼容Nacos、Eureka、Dubbo、Feign),Nacos同时支持 Dubbo和Feign两种架构
SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第7张图片

企业的排列组合:

  • SpringCloud + Feign(Feign)
  • SpringCloudAlibaba + Feign(Feign)
  • SpringCloudAlibaba + Dubbo(Dubbo)
  • Dubbo原始模式(老了)

5. SpringCloud

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第8张图片

大多数都是从其他公司整合的

SpringCloud和 Springboot的兼容关系
SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第9张图片

6. 服务拆分

  1. 不同微服务不要开发重复的相同业务,微服务需要根据业务模块拆分,做到单一职责
  2. 微服务数据独立,不要访问其他微服务的数据库,不同微服务都应该有自己独立的数据库
  3. 微服务可以将自己的业务暴露为接口,供其他微服务调用

7. 远程调用

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第10张图片

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第11张图片

在Java里发送HTTP请求:

首先在 Springboot启动类配置bean

/**
 * 创建RestTemplate对象,交给Spring容器管理
 * @return
 */
@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

自动装配

    @Autowired
    private RestTemplate restTemplate;

完善service

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);

        // 2. 利用 RestTemplate 调用 user-service 的接口,查询用户信息
        String url = "http://localhost:8081/user/" + order.getUserId();
        User forObject = restTemplate.getForObject(url, User.class);
        order.setUser(forObject);

        // 4.返回
        return order;
    }

8. Euraka - Euraka原理分析

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第12张图片
提供者:暴露接口给其它微服务调用服务
消费者:调用其它微服务提供的接口

提供者与消费者角色其实是相对的

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第13张图片

消费者该如何获取服务提供者具体信息?

  • 服务提供者启动时向eureka注册自己的信息
  • eureka保存这些信息
  • 消费者根据服务名称向eureka拉取提供者信息

如果有多个服务提供者,消费者该如何选择?

  • 服务消费者利用负载均衡算法,从服务列表中挑选一个

消费者如何感知服务提供者健康状态?

  • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
  • eureka会更新记录服务列表信息,心跳不正常会被剔除
  • 消费者就可以拉取到最新的信息

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第14张图片

9. Euraka - EurakaServer 搭建

新建模块,取名 euraka-server

添加pom.xml


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

新建启动类

package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

新建配置文件 application.yml

server:
  port: 10086 # 服务端口
spring:
    application:
        name: eureka-server # eureka的服务名称
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka/ # 服务地址

10. Euraka - 服务注册


 <dependency>
     <groupId>org.springframework.cloudgroupId>
     <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
 dependency>
spring:
    application:
      name: order-service # eureka的服务名称
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka/ # 服务地址

多开实例:
增加vm options:

-Dserver.port=8032

在这里插入图片描述

11. Euraka - 服务发现拉取

  1. URL里,用服务名代替IP端口
  2. 给RestTemplate的Bean加注解@LoadBalanced
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);

        // 2. 利用 RestTemplate 调用 user-service 的接口,查询用户信息
        String url = "http://user-service/user/" + order.getUserId();
        User forObject = restTemplate.getForObject(url, User.class);
        order.setUser(forObject);

        // 4.返回
        return order;
    }

12. Ribbon 负载均衡原理

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第15张图片

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第16张图片

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第17张图片
更改规则

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第18张图片

@Bean
public IRule randomRule() {
    return new RandomRule();
}
user-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

13. Ribbon 饥饿加载

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第19张图片

ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients:  # 指定要开启饥饿加载的服务名称
      - user-service

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第20张图片

14. Nacos 安装

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:

GitHub主页:https://github.com/alibaba/nacos

GitHub的Release下载页:https://github.com/alibaba/nacos/releases

startup.cmd -m standalone

在cloud-demo父工程添加依赖

<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    <version>2.2.5.RELEASEversion>
    <type>pomtype>
    <scope>importscope>
dependency>

注释掉之前的 eureka 依赖

客户端依赖:

<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
spring:
  cloud:
    nacos:
      server-addr: locahost:8848

默认用户名/密码为: nacos/nacos

15. Nacos - 服务多级存储模型

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第21张图片

服务集群属性

  1. 修改 application.yml
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第22张图片

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第23张图片

15. Nacos - NacosRule负载均衡

把 User1, User2,Order分配到HZ,User3 SH。
然后Order在远程调用User的时候,优先选择本地集群(即User1, User2)

修改 Order的配置:

user-service:
  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

16. Nacos - 服务实例的权重配置

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第24张图片
SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第25张图片
如果权重为0,该服务就不会被访问。
SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第26张图片

17. Nacos 环境隔离namespace

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第27张图片
环境隔离就是对服务进行隔离。

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第28张图片
SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第29张图片
SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第30张图片
配置,在具体服务里application.yml 添加配置:

spring:
  cloud:
    nacos:
      discovery:
        namespace: c3b1bbc3-0ebd-4298-92c2-1e54858acf02

此时,两个namespace的服务就已经阴阳两隔了。

总结:

  • namespace 用来做环境隔离
  • 每个namespace 都有唯一ID
  • 不同namespace下的服务不可见

18. Nacos 与 Eureka

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第31张图片
临时实例

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 是否为临时实例

SpringCloud笔记 - Day1 概念&注册中心&负载均衡_第32张图片

你可能感兴趣的:(#,Spring,spring,cloud,负载均衡,java)