微服务架构初学--入门

本文介绍了微服务架构的基本概念,包括单体式架构的特点和微服务架构的优势。详细讲解了如何搭建SpringBoot工程,涉及Eureka作为注册中心的配置与使用,以及Eureka的高可用集群和自我保护机制。同时,对比了Eureka与Consul的区别,探讨了服务注册与发现的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件架构分类

  • 单体式架构
  • 微服务架构
单体式架构特点
  • 项目迭代不灵活
  • 项目组责任权限不清
  • 项目并发配置不灵活
微服务项目特点
  • 项目复杂度降低
  • 团队界限明确
  • 扩展灵活
相关概念
  • Provider和Consumer
  • RPC:Remote Procedure Call(远程过程调用)
  • Restful :Representational State Transfer,一组框架约束条件和原则
  • 分布式
  • 集群

搭建SpringBoot工程

步骤
  • 总父工程
  • 通用模块api
  • 服务提供者
  • 服务消费者
父类所需依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>


<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

注册中心Eureka所需依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

提供者所需依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <artifactId>common-api</artifactId>
        <groupId>com.zb</groupId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

消费者所需依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <artifactId>common-api</artifactId>
        <groupId>com.zb</groupId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

具体实现流程
  • Eureka启动类
@SpringBootApplication
@EnableEurekaServer
public class MyEurApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyEurApplication.class,args);
    }
}
  • Eureka配置文件
server:
  port: 7473
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7473/eureka/

  • 服务提供者配置文件
server:
  port: 7007
spring:
  application:
    name: server-order
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7473/eureka/
  instance:
    prefer-ip-address: true #管控台上显示服务的ip和端口
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

在这里插入图ss片描述

  • 实现类正常放
  • 提供者启动类
@SpringBootApplication
@EnableEurekaClient
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class,args);
    }
}

消费者

在这里插入图片描述

  • service层
    在这里插入图片描述
  • controller层
    在这里插入图片描述
  • provider启动类
    在这里插入图片描述

常见的注册中心

  • Zookeeper

zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。简单来说zookeeper=文件系统+监听通知机制。

  • Eureka

Eureka是在Java语言上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflflix中的重要组件
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器
三大角色:

  1. Eureka Server 提供服务注册和发现
  2. Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
  3. Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务
  • Consul

Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件,采用Raft算法保证服务的一致性,且支持健康检查。

  • Nacos

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是注册中心 + 配置中心的组合,提供简单易用的特性集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。Nacos 还是 Spring Cloud Alibaba 组件之一,负责服务注册与发现

Eureka Server 高可用集群

搭建多个Eureka服务器
– 配置文件

在这里插入图片描述

  • 在管控台上显示ip和端口
  instance:
    prefer-ip-address: true #管控台上显示服务的ip和端口
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
Eureka剔除问题

在这里插入图片描述

Eureka的自我保护

在这里插入图片描述

Eureka替换方案Consul

两者区别

  1. 一致性
    Consul强一致性(CP)
    Eureka保证高可用和最终一致性(AP)
  2. 开发语言和使用
    eureka就是个servlet程序,跑在servlet容器中
    Consul则是go编写而成,安装启动即可

启动sonsul
consul agent -dev -client=0.0.0.0

– 所需依赖

<!--SpringCloud提供的基于Consul的服务发现-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--actuator用于心跳检查-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

– 修改每个微服务的配置文件

server:
  port: 9001
spring:
  application:
    name: user-server-consumer #唯一
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
        register: true
        instance-id: ${spring.application.name}-${server.port}
        service-name: ${spring.application.name}
        port: ${server.port}
        ip-address: ${spring.cloud.client.ip-address}
        prefer-ip-address: true

其中
spring.cloud.consul 中添加consul的相关配置
host:表示Consul的Server的请求地址
port:表示Consul的Server的端口
discovery:服务注册与发现的相关配置
instance-id : 实例的唯一id(推荐必填),spring cloud官网文档的推荐,为了保证生成一
个唯一的id ,也可以换成
spring.application.name:{spring.application.name}:spring.application.name:{spring.cloud.client.ipAddress}
prefer-ip-address:开启ip地址注册
ip-address:当前微服务的请求ip

客户端调用服务端的三种实现方式
  1. 第一种实现是不需要任何注册中心
@Override
 public List<Order> currentUserOrderInfo(Integer uid) {
     String url = "http://localhost:8001/findOrderByUid/" + uid;
     //http请求调用远程方法
     List<Order> list = restTemplate.getForObject(url, List.class);
     return list;
 }

  1. 第二种方式在启动类上添加@EnableDiscoveryClient
 @Override
 public List<Order> currentUserOrderInfo(Integer uid) {
     System.out.println("discoveryClient调用");
     List<ServiceInstance> instances = discoveryClient.getInstances("order-server-provider");
     ServiceInstance serviceInstance = instances.get(0);
     String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/findOrderByUid/" + uid;
     System.out.println(url);
     //http请求调用远程方法
     List<Order> list = restTemplate.getForObject(url, List.class);
     return list;
 }

  1. 这种方式采用ribbon的负载均衡使用时,必须要求在RestTemplate上添加@LoadBalanced
 @Override
 public List<Order> currentUserOrderInfo(Integer uid) {
//这种方式采用ribbon的负载均衡使用时,必须要求在RestTemplate上添加@LoadBalanced
     String url = "http://order-server-provider/findOrderByUid/" + uid;
     //http请求调用远程方法
     List<Order> list = restTemplate.getForObject(url, List.class);
     return list;
 }

Ribbon

在这里插入图片描述

步骤
  1. 在consumer启动类加入
    在这里插入图片描述
  2. 获取provider
    在这里插入图片描述
  3. 多拷贝几个提供者测试负载均衡
  4. 在消费者中加入
#负载均衡:提供者
order-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值