SpringCloud-常用组件介绍

分布式系统开发用于分布式环境(多个服务器不在同一个机房,同一个业务服务在多台服务器运行)

Spring Cloud 是基于Springboot的分布式云服务架构,SpringCloud的设计就是为了分布式的云环境设计

下面说一些SpringCloud项目在开发中常用的几个组件

说组件之前,将一些分布式相关的概念

CAP定理 指分区容错性 服务可用性 数据一致性,分布式环境:

容错性,允许部分机器故障,但是系统人能正常运作

服务可用性 任何时候调用服务有响应

数据一致性 任何时候获取数据都一样(访问不同机器节点相同的业务数据)

CAP定理因为分布式而存在,离开具体业务相对来说有些抽象,CAP只是说设计系统时的参考思想;但很明显的意思就是为了提高系统稳定性,让原来的一台服务器变成多台,提供相同服务,部分服务器坏了没关系,其他正常服务器能提供服务,从而让使用系统的一方不受影响,觉得这个系统是稳定的,但随之而来的是不同服务器之间数据如何同步,协作,就成了分布式系统要面对的问题。

简单的商城分布式系统,一个服务会运行在多台机器上,买商品下单这一个件事,需要多台服务器中的一个去完成,如果有两台服务器宕机,就去访问没有宕机的服务器(容错性)。下单是调用服务,调用服务这个过程是需要畅通的,不能等很久,下单服务在最多1秒左右就完成。(服务可用性)。下完单,被调用的服务器需要修改商品库存数据,将库存减一(x-1)。在这之后其他服务器访问显示商品库存也是x-1,而不是x(数据一致性)。

SpringCloud-常用组件

SpringCloud分布式组件提高了系统的开发效率,稳定性,可维护性

SpringCloud-Config 服务配置,提供统一配置功能。多个服务,或者服务器启动后,配置文件都在Config中,方便管理(分布式统一配置相关)

SpringCloud-Eureka 服务注册,提供注册服务。服务启动后,可以提供自己的服务地址注册到Eureka,暴露出来提供给其他人调用(服务可用性相关)

SpringCloud-OpenFeign 服务代理,提供代理调用服务。A服务要调用B服务,可以通过feign,feign是服务调用更方便(远程服务调用相关)

SpringCloud-Gateway 网关路由服务,提供代理访问转发。 访问narule.net/api 实际访问narule.github.io/api 可以通过Gateway来实现。(访问安全相关)

还有很多其他组件,比如redis相关组件用于数据一致性访问,kafka用于高吞吐消息队列等,本文主要讲上面提到的四个,通过代码简单说明如何使用。

example 代码地址:springcloud-example

如果要其中里面的服务,请务必先启动config-server,因为里面的项目都是通过config统一配置,设置服务的端口等参数

Config

Config作为配置中心,能够很方便配置每个分布式系统参数,配置文件可以通过git等仓库专门管理

参考代码:config

测试访问:http://localhost:8888/eureka-server.yml http://localhost:8888/eureka-client.yml

example

关键配置是application.yml中配置文件的位置,一般由url指定

dependencies 依赖

serverConfig-pom.xml

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>

application.yml

server:
  port: 8888 #服务端口
spring:
  application:
    name: server-config  #服务名
  cloud:
    config:
      server:
        git:
          uri: https://github.com/narule/spring-cloud-config   #配置文件地址
          #username: narule
          #password: password
    refresh:
      enabled: true

ServerConfigApplication

启动程序,除了SpringBootApplication,还需要EnableConfigServer注解:

package net.narule.spring.cloud.config.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}

}

配置读取规则

如果启动程序 spring.application.name=server1-client,并且配置了远程配置,此程序会尝试从远程读取server1-client.yml 文件的配置参数,这是springcloud-config配置规则

客户端应用读取配置只需要依赖spring-cloud-starter-config ,不需要在启动类中写什么注解

client-dependencies

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

client-application.yml

config 3.0 有新增配置

# client一般指定配置路径
spring:
  application:
    name: config-client-one #一定要在本地指定 spring.application.name 才能读取远程配置

  cloud:
    refresh:
      enabled: true
    config:
      uri:
      - http://localhost:8888 # config-server的访问地址

# 3.0之后指定 指定url方式
spring:
  application:
    name: config-client-one
  config:
    import:
     - optional:configserver:http://narule.net:8888 #config-server的访问地址

Eureka

Eureka提供服务注册,分为注册中心和客户端,注册中心使用@EnableEurekaServer

客户端有producer服务提供者,consumer 服务消费者,在使用时,都使用@EnableEurekaCilent注解,启动服务的时候,将自己的服务信息,ip和端口号等,注册到Eureka服务中心,让其他eurekaclient能通过Eureka服务注册中心获取服务的ip和端口号。

参考代码:eureka

测试访问:https://localhost:1999/eureka-server

example

服务端,主要参数是服务的节点,注册节点地址,注册账号密码(可选)

server-dependencies 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--Spring Boot Actuator,感应服务端变化-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- security 此模块权限校验 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
</dependency>

server-application.yml

eureka:
  dashboard:
    path: eureka-server  #注册中心访问path
  instance:
    hostname: localhost
  client:
    registerWithEureka: false #将自己注册微eurekaclient false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/  #注册节点地址
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 10000
server:
  port: 1999
spring:
  application:
    name: eureka-server

  # 安全认证的配置 - 为了 eureka-server 查看和注册添加权限 可选配置
  security:
    user:
      name: eureka  # 用户名
      password: dsp   # 用户密码

EurekaServerApplication

配置文件配置好后,使用@EnableEurekaServer注解即可

package com.wunanyu.cloud.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

客户端

client-dependencies

客户端依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

client-application.yml

配置文件主要是指定注册中心地址,通过这个配置客户端可以把自己的服务注册到注册中心,或者从注册中心获取其他服务的信息,

server:
  port: 8080
#Eureka实例名,集群中根据这里相互识别
spring:
  application:
    name: lock-redis

eureka:
#客户端
  client:
#注册中心地址
    service-url:
      defaultZone: http://eureka:dsp@13.228.36.167:1999/eureka/

  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} # 实例id命名规则,这个用于区分同一服务在不同的机器,可应用于分布式锁
    prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
    hostname: localhost

EurekaClientApplication

客户端的使用是注解@EnableEurekaClient,有这个注解,启动时会把自己的信息注册到服务中心,当然要配置注册中心节点信息,让客户端知道注册地址在哪。

package com.domoment.eureka.client;

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

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

OpenFeign

Feign和eureka一样是Nexflix的组件,可以用作接口调用Eureka服务,完成服务于服务之间的调用

参考代码:openfeign

测试访问:http://localhost:1666/request-feign-client

example

dependencies 依赖

因为feign通过eureka调用服务,并且在分布式环境考虑到负载均衡,所以依赖除了feign,还有ribbon和eureka

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>
        spring-cloud-starter-netflix-eureka-client
    </artifactId>
</dependency>

FeignClientApplication

要使用feign功能,启动类需要使用注解@EnableFeignClients @EnableDiscoveryClient

package net.narule.spring.cloud.feign.client;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableFeignClients
@RestController
public class FeignClientApplication {

public static void main(String[] args) {
SpringApplication.run(FeignClientApplication.class, args);
}
@Autowired
private FeignInterFace feignInterFace;

@RequestMapping("/request-feign-client")
public ResponseResult requestFeignClient() {
String id = String.valueOf(System.currentTimeMillis());
ResponseResult reuqestEurekaClient = feignInterFace.reuqestEurekaClient(id);
return ResponseResult.ok(reuqestEurekaClient);
}

@FeignClient("eureka-client")
interface FeignInterFace {

@RequestMapping(value = "/request-eureka-client/{id}")
public ResponseResult reuqestEurekaClient(@PathVariable("id") String id);

}

}

FeignInterface

Feign使用时,只需要写接口,并在注解上配好url即可,不需要写代码实现方法,

@FeignClient("eureka-client")表示有服务名叫eureka-client,方法上的value = "/request-eureka-client/{id}" 说明eureka-client服务有/request-eureka-client/{id}的请求路径,这是要对应的,并且eureka-client服务注册到eureka注册中心,不然服务调用失败。

@FeignClient("eureka-client")
interface FeignInterFace {

    @RequestMapping(value = "/request-eureka-client/{id}")
    public ResponseResult reuqestEurekaClient(@PathVariable("id") String id);

}

feign-client.yml

配置文件需要指定eureka的注册节点,因为feign最终通过eureka获取服务信息来完成接口访问

server:
  port: 1666

eureka:
#客户端
  client:
#注册中心地址
    service-url:
      defaultZone: http://localhost:1999/eureka/

Gateway

gateway是网关组件,此组件可以用来转发请求,设置路由,比较灵活。

如果有服务访问路径是http://localhost:1666/request-feign-client 我们可以因为一些个性化需求改变路由

通过gateway可以让访问http://localhost:12000/api/feign/request-feign-client 等同于上面的访问路径

参考代码:gateway

测试访问:http://localhost:12000/api/feign/request-feign-client

example

gateway-dependencies

gateway作为网关服务,可以搭配eureka使用

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>
        spring-cloud-starter-netflix-eureka-client
    </artifactId>
</dependency>

GatewayServerApplication

@SpringBootApplication
public class GatewayServerApplication {

public static void main(String[] args) {
SpringApplication.run(GatewayServerApplication.class, args);
}
}

gateway-server.yml

server:
  port: 12000

spring:
  cloud:
    gateway:
      routes:
        # 路由ID(一个路由配置一个ID)
        - id: eureka-c

          # 通过注册中心来查找服务(lb代表从注册中心获取服务,并且负载均衡)
          uri: lb://eureka-client/

          # 匹配到的以/api/eureka/ 通过eureka访问 eureka-client/**
          predicates:
            - Path=/api/eureka/**
          # 去掉匹配到的路径的前2级 这里也就是 /api/eureka
          filters:
            - StripPrefix=2

        - id: feign-c

          uri: lb://feign-client/
   # 匹配到的以/api/feign/开头的路径都转发到feign-client的服务,相当于访问 lb://feign-client/**
          predicates:
            - Path=/api/feign/**
          # 去掉匹配到的路径的前2级 这里也就是 /api/feign
          filters:
            - StripPrefix=2
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true

eureka:
#客户端
  client:
#注册中心地址
    service-url:
      defaultZone: http://localhost:1999/eureka/

来源:https://www.icode9.com/content-4-842001.html

(0)

相关推荐

  • 7、Spring Cloud Hystrix

    7、Spring Cloud Hystrix

  • SpringCloud微服务架构实战:微服务治理

    微服务治理 Spring Cloud 工具套件为微服务治理提供了全面的技术支持.这些治理工具主要包括服务的注册与发现.负载均衡管理.动态路由.服务降级和故障转移.链路跟踪.服务监控等.微服务治理的主要 ...

  • spring cloud微服务快速教程之(四)熔断器(Hystrix)及其工具(Dashboard、Turbine)

    0-为什么需要熔断器 在分布式系统中,各个服务相互调用相互依赖,如果某个服务挂了,很可能导致其他调用它的一连串服务也挂掉或者在不断等待中耗尽服务器资源,这种现象称之为雪崩效应: 未来防止系统雪崩,熔断 ...

  • springcloud学习(一)之Eureka

    前言 微服务原则上是应该有多个服务提供者的实例的,在通常情况下服务提供者的数量和分布往往是动态变化的,这样在传统的单体应用中的那种硬编码服务url进行远程调用的方式就不足取.服务注册中心就是为了解决服 ...

  • springcloud组件技术分享(推荐)

    目录 1. 项目初始化配置 2. Eureka 3. Ribbon 4. Feign学习 5. hystrix学习 6. springboot的健康监控actuator 7. feign配合Hystr ...

  • 微服务实战——高可用的SpringCloudConfig

    管理微服务配置 对于单体应用架构来说,会使用配置文件管理我们的配置,这就是之前项目中的application.properties或application.yml.如果需要在多环境下使用,传统的做法是 ...

  • spring cloud微服务快速教程之(二)服务注册与发现 eureka

    0.为什么需要eureka 当我们从当体系统拆分为多个独立服务项目之后,如果aaa.com/uer.aaa.com/order;:相互之间调用,如果只是一个服务一个实例,那还可以直接通过固定地址(如h ...

  • 8种常用农药介绍,价格便宜效果很好!

    农业生产最怕的就是遇见病虫害,最可恨的是病虫害类型繁多,有时遇到了却不能"对症下药",最终影响农作物生长及其产量. 今天,给大家分享的这8种农药用途,看明白后,大部分病虫害都能防治 ...

  • 收藏!西门子SCL语言编程,常用指令介绍

    蓝字 '玩转PLC工业机器人" 关注我们哦! 玩转PLC工业机器人 垂直PLC领域,定期分享工业机器人.PLC.变频器.模拟量.定位控制.通信控制.HMI.行业资讯等工控技术,为广大工控人提 ...

  • photoshop的工具栏及常用工具介绍

    一.工具栏介绍Photoshop CS6的工具栏拥有60多个工具,如果把所有的工具展开放到面前,只看上一眼恐怕都会令人生畏.但如果我们能够理解每个工具的具体作用和使用方法,就能在实际应用中非常快速地决 ...

  • 机械行业常用金属介绍——40Cr钢

    机械行业常用金属介绍——40Cr钢

  • windows Telnet 客户端常用命令介绍

    Telnet协议是TCP/IP协议家族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连 ...

  • 强直吃什么药效果最好?(三大类常用药物介绍)

    应聘全职及兼职编辑,发送简历至 chenlf@high-med.com 在日常门诊中,经常有强友问道:强直性脊柱炎吃什么药最好? 坦白讲,这是没有标准答案的.因为没有哪一种"神药" ...

  • 虫害|红蜘蛛发育过程!不同时期9种常用杀螨剂介绍

    红蜘蛛生育期及常见杀螨剂成分介绍 一.认识红蜘蛛 柑橘红蜘蛛,学名柑橘全爪螨,是柑桔上危害性最大的害虫,气温在25度左右时繁殖最盛,世代重叠严重,5月-6月螨量最多,7-8月份因高温叶螨发生数量很少, ...

  • python tkinter常用组件

    时间过得飞快,一转眼,半年又要过去了,好像什么也没有,好像什么也没做... tkinter提供各种组件,如按钮.标签.文本行.菜单.滚动条等等. 1.创建组件 通过调用其构造函数即可创建组件,如: b ...

  • 精神科常用药物介绍及副反应处置

    小编废话:老朋友应该发现了,这是以前发过的老课件,做的很好,真心致谢原作者.话说:最近问精神科药物相关的略多啊,是因为要考试了么.......

  • 学术研究中常用的介绍型短语有哪些?

    学术研究要求我们仔细审查信息并评估其可信度.因此,当我们思考各种现象时,我们会检验经验数据,并精心制作详细的解释来证明我们的解释是正确的.构建我们的研究叙事的一个重要组成部分是提供支持的证据和例子. ...