SpringCloud

相关资料
springcoud入门
springcoud入门
Eureka
Ribbon
Eureka集群
Hystrix
gateway
gateway过滤器

SpringCloud的五大功能

  • Eureka:服务治理组件,包含服务注册与发现
  • Ribbon:客户端负载均衡的服务调用组件
  • Hystrix:容错管理组件,实现了熔断器
  • Zuul:网关组件,提供智能路由、访问过滤等功能
  • Config:外部化配置组件

一个文件夹整合整个项目

  • 新建一个maven项目
  • 把src删了,把pom.xml改了
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
    <relativePath/>
</parent>
<groupId>com.pdt</groupId>
<artifactId>pdt</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
  • 后续的所有模块都添加在这个文件夹里,用module新建maven项目
  • 如果没有多个域名的服务器做测试需要在本地把host文件改了
127.0.0.1 eureka7001
127.0.0.1 eureka7002
127.0.0.1 eureka7003

Eureka中的三大角色

  • Eureka Server:服务的注册与发现
  • Service provider 服务的提供者,将服务注册到Eureka,当中
  • Servce consumer 服务发消费者 ,从Eureka服务列表中获得服务,然后进行消费

Eureka管理者,就是zookeeper

image.png

  • 其实就是这个maven
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
###服务端口号
server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001
  client:
    fetch-registry: false # 不用检索服务 自己是注册中心
    register-with-eureka: false #不向注册中心注册自己
    // 服务端集群配置
    service-url:
      defaultZone: http://eureka7001:7001/eureka
@EnableEurekaServer
@SpringBootApplication
public class Eureka7001Application {
    public static void main(String[] args) {
        SpringApplication.run(Eureka7001Application.class,args);
    }
}
  • 启动后访问http://localhost:7001看到一个网站

image.png

Eureka功能提供者

image.png

  • 其实就是这个maven
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
# 服务提供者yml配置
server:
  port: 8001

spring:
 application:
   name: provider

eureka:  #设置eureka注册服务的地址
  client:
    service-url:
       defaultZone: http://eureka7001:7001/eureka/
  instance:
    instance-id: microservice-provider-dept-8001 #配置服务的别名
    prefer-ip-address: true # 注册的时候使用ip注册
@SpringBootApplication
@EnableEurekaClient
public class provider{
    public static void main(String[] args) {
        SpringApplication.run(provider.class, args);
    }
}
  • 暴露服务,就是正常的一个MVC接口就行
  • 把上面的功能模块启动后,就能在服务管理者刚才的网站上看到一个provider服务

Eureka消费者

  • 跟功能提供者一样的新建思路,maven依赖也一样
  • 添加ribbon的maven依赖,ribbon往下看,这里直接用
  • 功能提供者也能是消费者,相互调用
  • 这是是表示入口消费者,也就是自定义网关,需要有一个入口把所有的服务都总结起来,所有人都访问这个入口就行,如果有多个一样的入口,就需要用nginx轮询代理
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • yml配置
server:
  port: 80

eureka:
  client:
    service-url:
       #eureka发现服务的列表
       defaultZone: http://eureka7001:7001/eureka
    #自己不能注册 自己只需要通过eureka发现服务
    register-with-eureka: false
  • 修改入口文件,添加注解
@SpringBootApplication
@EnableDiscoveryClient
public class consumer{
    public static void main(String[] args) {
        SpringApplication.run(consumer.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
@Service
public class testService {
    @Autowired
    RestTemplate restTemplate;

    public String test(String name) {
        // 把服务提供者的spring.application.name填进来 + service名字
        String str = restTemplate.getForObject("http://provider/test,String.class,name);
        return str; 
    }
}

Ribbon
负载均衡的功能模块,这里有个知识点,负载均衡有两种模式,一种是集中式,一种是进程式,nginx就是集中式,由nginx安排请求给服务,而ribbon是进程式,请求先获取我有几个服务可以选,然后自己选,具体怎么用

  • 服务提供者复制几份一样的,只修改自己的端口,其他不变
  • 给消费者添加ribbon的maven依赖,添加注解@LoadBalanced就行了
  • 这个默认是使用轮询的,也可以自定义

gateway

  • 因为自定义网关太麻烦了,所以需要使用专业网关zuul
  • 这个是zuul的升级版,现在用这个了
<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>
server:
  port: 80
spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001:7001/eureka/
  • 就依赖和配置启动就行,然后刷新eureka控制台可以看到服务,访问http://localhost/ORDER/xxx就能看到效果,中间的注册ID是大写的
  • 过滤器,比如白名单,黑名单,登陆状态等等
// 全局过滤器
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public int getOrder() {
        return 0;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        RequestPath path = exchange.getRequest().getPath();
        System.out.println(path);
        return chain.filter(exchange);
    }
}

Eureka-server集群

  • 复制几份,【7001,7002,7003】,修改配置
server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001
  client:
    fetch-registry: false # 不用检索服务 自己是注册中心
    register-with-eureka: false #不向注册中心注册自己
    service-url:
      defaultZone:  http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002
  client:
    fetch-registry: false # 不用检索服务 自己是注册中心
    register-with-eureka: false #不向注册中心注册自己
    service-url:
      #集群版本 配置7001 7003eureka服务的地址信息
      defaultZone:  http://eureka7001:7001/eureka,http://eureka7003:7003/eureka
server:
  port: 7003

eureka:
  instance:
    hostname: eureka7003
  client:
    fetch-registry: false # 不用检索服务 自己是注册中心
    register-with-eureka: false #不向注册中心注册自己
    service-url:
      defaultZone:  http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
  • 修改所有服务提供者的配置
eureka:  #设置eureka注册服务的地址
  client:
    service-url:
        defaultZone:  http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
  • 修改所有服务消费者的配置
eureka:
  client:
    service-url:
#eureka发现服务的列表
       defaultZone:  http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka

image.png

Hystrix
熔断机制,就是在同个服务的同个类里添加处理异常的方案,目的是为了在链式调用里防止某个环节断裂

  • 在【Eureka消费者】不变的情况下加maven依赖
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
  • 在原来的基础上改入口文件添加注解
@EnableCircuitBreaker
public class TestApp {
   ...
}
  • 在原来的基础上改代码
@Service
public class testService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "testHystrix")
    public String test(String name) {
        String str = restTemplate.getForObject("http://app-item/item,String.class,name);
        sout(str)
        return str; 
    }

    public String testHystrix(String name) {
        return "熔断了"; 
    }
}

config

  • 集体配置,让客户端访问服务端,服务端再去访问git/svn,好像没什么意义

nacos

  • 阿里的Eureka,跟zk一样是下载个服务,启动后当做远程注册机

Feign

  • 这个是ribbon的升级版
  • 麻烦

Sentinel

  • 阿里的Hystrix
posted @ 2020-08-18 14:33  一个年轻淫  阅读(280)  评论(0编辑  收藏  举报