springcloud(1)

1.SpringCloud是什么?

SpringCloud是一系列框架的有序集合。【包含了开发所需的其他的框架】。它利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用SpringBoot的开发风格做到一键启动和部署。

       通俗地讲,SpringCloud就是用于构建微服务开发和治理的框架集合(并不是具体的一个框架),主要贡献来自Netflix OSS。

 

SpringCloud模块介绍

       Eureka [juˈriːkə] :服务注册中心,用于服务管理。

       Ribbon [ˈrɪbən] :基于客户端的负载均衡组件。

       Hystrix:容错框架,能够防止服务的雪崩效应。

       Feign  [feɪn]:Web服务客户端,能够简化HTTP接口的调用。

       Zuul:API 网关,提供路由转发、请求过滤等功能。

       Config:分布式配置管理。

       Sleuth [sluːθ]:服务跟踪。

       Stream:构建消息驱动的微服务应用程序的框架。

       Bus:消息代理的集群消息总线。

       除了上述模块,还有 Cli、Task等

2. SpringCloudEureka

SpringCloudEureka是SpringCloudNetflix微服务套件的一部分,基于Netflix Eureka做了二次封装,主要负责实现微服务架构中的服务治理功能。

       SpringCloudEureka是一个基于REST的服务,并且提供了基于Java的客户端组件,能够非常方便地将服务注册到SpringCloudEureka中进行统一管理。

       服务治理是微服务架构中必不可少的一部分,阿里开源的 Dubbo 框架就是针对服务治理的。服务治理必须要有一个注册中心,除了用Eureka作为注册中心外,我们还可以使用 Consul、Etcd、Zookeeper等来作为服务的注册中心。

       用过Dubbo的读者应该清楚,Dubbo中也有几种注册中心,比如基于Zookeeper、基于Redis等,不过用得最多的还是Zookeeper方式。

      

       为什么 Eureka 比 Zookeeper 更适合作为注册中心呢?主要是因为 Eureka 是基于 AP 原则构建的,而 ZooKeeper 是基于 CP 原则构建的。

       在分布式系统领域有个著名的 CAP 定理,即 C 为数据一致性;A 为服务可用性;P 为服务对网络分区故障的容错性。这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个。

       Zookeeper 有一个 Leader,而且在这个 Leader 无法使用的时候通过 Paxos(ZAB)算法选举出一个新的 Leader。这个 Leader 的任务就是保证写数据的时候只向这个 Leader 写入,Leader 会同步信息到其他节点。通过这个操作就可以保证数据的一致性。

       总而言之,想要保证 AP 就要用 Eureka,想要保证 CP 就要用 Zookeeper。

       Dubbo 中大部分都是基于 Zookeeper 作为注册中心的。Spring Cloud 中当然首选 Eureka。

 

 

 

3.搭建Eureka服务注册中心

springboot版本要和eureka依赖版本匹配,不然报错

2.6.6-----3.1.1     2.5.12------3.0.2

(1)创建一个SpringBoot项目【2.6.6】

(2)pom.xml导入依赖

   <!--eureka-server-->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

            <version>3.1.1</version>

        </dependency>

(3)在主类中设置@EnableEurekaServer注解

package com.weiwei.eurekaserver;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer

public class EurekaServerApplication {

    public static void main(String[] args) {

        SpringApplication.run(EurekaServerApplication.class, args);

    }

}

(4)配置application.properties文件

spring.application.name=eurekaserver
server.port=8761
#由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
eureka.client.register-with-eureka=false
#由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
#eureka.client.register-with-eureka
一定要配置为false,不然启动时会把自己当作客户端向自己注册,会报错。
eureka.client.fetch-registry=false

(5)启动主类,测试 http://localhost:8761

出现以下页面成功

 

4.服务提供者

(1)创建一个SpringBoot项目【2.6.6】

(2)导入依赖

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!--eureka-client-->

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

    <version>3.1.1</version>

</dependency>

(3)配置application.properties文件

spring.application.name=serviceProvider1

server.port=9090

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

#采用IP注册

eureka.instance.preferIpAddress=true

#定义实例ID格式

eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
 

 

(4)创建接口和实现类和控制类

public interface UserService {

    String getName();

}

@Service

public class UserServcieImpl implements UserService{

    @Override

    public String getName() {

        return "你好Eureka";

    }

}

@RestController

public class UserController {

    @Autowired

    private UserService userService;

    @RequestMapping("/user.do")

    public String getName(){

        return userService.getName();

    }

}

(5)启动主类

注册中心会多出一个注册者

 

localhost:9090/user.do也可以打开

 

5.服务消费者

(1)创建一个SpringBoot项目【2.6.6】

(2)导入依赖

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!--eureka-client-->

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

    <version>3.1.1</version>

</dependency>

(3)创建RestTemplateConfiguration配置类

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.client.RestTemplate;



/**

 * 通过 RestTemplate 来消费接口

 *     RestTemplate Spring提供的用于访问 Rest 服务的客户端

 *     RestTemplate 提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率。

 */

@Configuration

public class RestTemplateConfig {

    @Bean

    public RestTemplate getRestTemplate() {

        return new RestTemplate();

    }

}

(4)创建消费者的控制器

@RestController

public class UserController {

    @Autowired

    private RestTemplate restTemplate;

    @RequestMapping("/show.do")

    public String shouName(){

        return restTemplate.getForObject("http://localhost:9090/user.do",String.class);

    }

}

(5)配置文件

spring.application.name=eurekaconsumer

server.port=8082

(6)主类设置@EnableEurekaClient注解

(7)测试服务消费者者

       1.启动注册中心服务

       2.运行服务提供者主类

    3.运行服务消费者者主类

       4.浏览器访问:http://localhost:8082/show.do

 

可以使用服务名称访问服务提供者提供的服务

1.修改RestTemplateConfiguration配置类,加上@LoadBalanced注解

@Configuration

public class RestTemplateConfig {

    @Bean

    //@LoadBalanced 使用服务名称访问服务提供者提供的服务

    @LoadBalanced

    public RestTemplate getRestTemplate() {

        return new RestTemplate();

    }

}

2. 修改服务消费者的控制器,把地址改了

@RestController

public class UserController {

    @Autowired

    private RestTemplate restTemplate;

    @RequestMapping("/show.do")

    public String shouName(){

        return restTemplate.getForObject("http://serviceProvider1/user.do",String.class);

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java-请多指教

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值