springcloud五大核心组件实践

SpringCloud五大组件
1.erueka(服务注册与发现)
2.ribbon(负载均衡)
3.Hystrix(短路器)
4.zuul(路由网关)
5.springcloudconfig(分布式配置中心)

准备工作:创建一个maven父工程

new project->maven
选好jdk,我是1.8,下一步
在这里插入图片描述
填好名称创建
在这里插入图片描述
创建完毕后,在父工程添加后面子工程要用到的依赖:
这里要注意springboot的版本和springcloud版本的对应,不然会冲突。springcloud官网有版本对应关系
在这里插入图片描述

    <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>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.13.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

1.erueka的搭建和erueka注册中心的集群

erueka分为服务端和客户端,服务端也就是我们说的服务注册中心。
先来搭建服务端:
点击父工程,new module。新建maven子工程
在这里插入图片描述
在这里插入图片描述
然后pom文件添加依赖

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

在这里插入图片描述
然后为服务添加主启动类和配置文件
在这里插入图片描述

主启动类上加上注解:@EnableEurekaServer
在这里插入图片描述
配置文件配置服务的端口号和erueka相关设置
需要注意:我的本地host文件有peer1到127.0.0.1的映射,如果没有配置的话,那么可以写localhost

server:
  port: 8761
eureka:
  instance:
    hostname: peer1 #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

然后启动服务,访问设置的端口号
http://localhost:8761/
页面如下图,设置成功。
在这里插入图片描述
好的,接下来我们搭建erueka的客服端,将客户端注册进上面配置的配置中心。
父工程下新建子工程
在这里插入图片描述
在pom文件导入依赖:

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

同样,为该服务创建配置文件和主启动类:
主启动类上加上注解@EnableEurekaClient
在这里插入图片描述

配置文件主要配置如下:

server:
  port: 8001
eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/
  instance:
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2
spring:
  application:
    name: provider-demo

开始测试,启动erueka服务端,在启动当前客户端
访问erueka界面
出现下图,则我们刚创建的erueka客户端注册进注册中心了。
在这里插入图片描述
然后我们再做一下erueka的集群
我们需要新建两个子工程,和之前的erueka服务端一样,pom导入相同的依赖。
编写主启动类加上@EnableEurekaServer注解,编写配置文件。然后我们把三个erueka服务端的配置文件稍作修改:

让它们的端口号不同,服务端实例名称不同,由于我们的集群测试是自己一台电脑模拟三台电脑进行集群,所以这里要实例名称不一样,然后再我们的本地host文件对实例的名称进行ip映射,映射到自己的电脑
在这里插入图片描述
最后把~defaultZone:服务地址改一下 。

server:
  port: 8761
eureka:
  instance:
    hostname: peer1 #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心
    service-url:
#      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
server:
  port: 8762
eureka:
  instance:
    hostname: peer2 #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心
    service-url:
#      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
server:
  port: 8763
eureka:
  instance:
    hostname: peer3 #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心
    service-url:
#      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka

然后我们把三个注册中心都启动起来,这个时候肯定要报错,因为三个服务启动总有先后顺序,所以它会因为找不到集群的其他服务而报错,没有关系的。

访问http://localhost:8761/,当然也可以访问8762或者8763查看。出现下图,也就设置集群成功了。
在这里插入图片描述

2.ribbon负载均衡

为了测试负载均衡,我们先按照上面springcloud-provider服务,再创建两个模拟的服务提供者。pom文件和启动类上注解都一样。
我们只需要在配置文件中修改端口号,把8000改成8001,8002。其中特别需要注意的是,三个的spring-applicaton-name属性要全部相同。这样才是负载均衡。
然后,我们访问erueka,看看provider-demo程序是否对应三个服务端口,如下:
在这里插入图片描述
然后,我们我们为了测试负载均衡的时候看到我们调用的那个端口的服务,我们再三个provider服务添加controller层,添加请求接口,输出不同的内容,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来,我们就创建一个调用三面上个provider提供的接口服务的消费者模块。
在这里插入图片描述
pom文件导入依赖:

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

创建主启动类并添加注解
@RibbonClient(name=“provider-demo”,configuration= MyselfRule.class)
@EnableEurekaClient
@SpringBootApplication
这里的@RibbonClient(name=“provider-demo”,configuration= MyselfRule.class)可以不加,加上就是我们需要自定义负载均衡策略,name是要负载均衡的服务名称,configuration是我们自定义的负载均衡规则类,不建议放在启动类同级目录或子层目录,因为那样我们的策略就对所有的ribbon生效了,达不到定制化了
在这里插入图片描述
如下图:我们要实现自定义负载均衡的话,我们定义类继承AbstractLoadBalancerRule,然后在MyselfRule中注入IRule的时候返回,我这里返回的是ribbon默认的轮询策略。
在这里插入图片描述
在这里插入图片描述
然后我们在consumer模块利用restTemplate,调用provider提供的服务。
要实现负载均衡,就要在restTemplate注入时加上@LoadBalanced
在这里插入图片描述

@RestController
public class ConsumerController {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("consumer/demo")
    public String ContumerDemo(){
        return this.restTemplate.getForObject("http://provider-demo/provider/demo",String.class);
    }
}

然后,我们可以测试了,我上面在MyselfRule返回的是ribbon的轮询策略,
我们在游览器多次请求 http://localhost:7001/consumer/demo
显示的顺序是
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也就是provider的实例每个调用一次,就是轮询。
你也可以试试在MyselfRule中return new RandomRule()。也就是随机策略,看看多次请求得到的顺序是否是随机的。

额,有点累了,剩下的springcloud笔记下次再整理。。。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值