zoukankan      html  css  js  c++  java
  • SpringCloud基础入门

    SpringCloud实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。

    1 其主要涉及的组件包括:

    • Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。(服务治理,服务注册/发现)

    • Zuul:网关组件,提供智能路由,访问过滤功能

    • Ribbon:客户端负载均衡的服务调用组件(客户端负载)

    • Feign:服务调用,给予Ribbon和Hystrix的声明式服务调用组件 (声明式服务调用)

    • Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)

    2 模拟使用场景

    首先,我们需要模拟一个服务调用的场景,搭建两个工程:test-service-provider(服务提供test方)和test-service-consumer(服务调用方)。

    服务提供方:使用mybatis操作数据库,实现对数据的增删改查;并对外提供rest接口服务。

    服务消费方:使用restTemplate远程调用服务提供方的rest接口服务,获取数据。

    3.eureka-server注册中心

    • Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址

    • 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)

    • 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新

    • 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态

    3.1搭建EurekaServer

    选择依赖:EurekaServer-服务注册中心依赖,Eureka Discovery-服务提供方和服务消费方。

    因为,对于eureka来说:服务提供方和服务消费方都属于客户端

    3.2编写application.yml

    server:
      port: 1096 # 端口
    spring:
      application:
        name: eureka-server # 应用名称,会在Eureka中显示
    eureka:
      client:
        service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
          defaultZone: http://127.0.0.1:${server.port}/eureka

    3.3修改引导类,在类上添加@EnableEurekaServer注解:

    @SpringBootApplication
    @EnableEurekaServer // 声明当前springboot应用是一个eureka服务中心
    public class MyEurekaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MyEurekaApplication.class, args);
        }
    }

    3.4启动服务,访问localhost:1096

    4.客户端(provider)注册到eureka

    注册服务,就是在服务上添加Eureka的客户端依赖,客户端代码会自动把服务注册到EurekaServer中。

    1. 在pom.xml中,添加springcloud的相关依赖。

    2. 在application.yml中,添加springcloud的相关依赖。

    3. 在引导类上添加注解,把服务注入到eureka注册中心。

    4.1在pom.xml中添加依赖

    <!-- SpringCloud的依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!-- Eureka客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    4.2修改application.yml配置

    server: port: 81 spring: datasource: url: jdbc:mysql://localhost:3306/springcloudtest username: root password: root driverClassName: com.mysql.jdbc.Driver application: name: service-provider # 应用名称,注册到eureka后的服务名称 mybatis: type-aliases-package: cn.test.service.pojo eureka: client: service-url: # EurekaServer地址 defaultZone: http://127.0.0.1:1096/eureka

    4.3在引导类上开启Eureka客户端功能

    @SpringBootApplication
    @EnableDiscoveryClient
    @MapperScan(cn.test.service.mapper) //使用tk包开启mapper扫描。->在mapper接口中不需要每个接口都加@Mapper注解
    public class MyServiceProviderApplication { public static void main(String[] args) { SpringApplication.run(MyServiceProviderApplication.class, args); } }

    重启访问eureka页面

    5.从EurekaServer获取服务(消费者 consumer)

    只需要在项目中添加EurekaClient依赖,就可以通过服务名称来获取信息了!

    5.1在pom中添加

        <!-- SpringCloud的依赖 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.SR2</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

    5.2修改配置

    server:
      port: 80
    spring:
      application:
        name: service-consumer
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:1096/eureka

    5.3在启动类开启Eureka客户端

    @SpringBootApplication
    @EnableDiscoveryClient // 开启Eureka客户端
    public class MyServiceConsumerApplication{
    
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(MyServiceConsumerApplication.class, args);
        }
    }

    5.4修改UserController代码,用DiscoveryClient类的方法,根据服务名称,获取服务实例:

    @Controller
    @RequestMapping("consumer/user")
    public class UserController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @Autowired
        private DiscoveryClient discoveryClient; // eureka客户端,可以获取到eureka中服务的信息
    
        @GetMapping
        @ResponseBody
        public User queryUserById(@RequestParam("id") Long id){
            // 根据服务名称,获取服务实例。也有可能是集群,所以得到的是service实例集合
            List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
            // 只有一个Service-provider。所以获取第一个实例
            ServiceInstance instance = instances.get(0);
            // 获取ip和端口信息,拼接成服务地址
            String baseUrl = "http://" + instance.getHost() + ":" + instance.getPort() + "/user/" + id;
            User user = this.restTemplate.getForObject(baseUrl, User.class);
            return user;
        }
    }

    6.Eureka基础架构

      Eureka架构中的三个核心角色:

    • 服务注册中心

      Eureka的服务端应用,提供服务注册和发现功能,如:test-eureka。

    • 服务提供者

      提供服务的应用,可以是SpringBoot应用,也可以是其它任意技术实现,只要对外提供的是Rest风格服务即可,如:test-service-provider。

    • 服务消费者

      消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。如:test-service-consumer。

  • 相关阅读:
    Mac中,在ITerm2下使用ssh访问Linux
    Yosemite下安装jdk、mysql、maven、idea
    SCP对拷如何连接指定端口(非22端口)的远程主机
    Mac下关于python版本的问题
    Mac中命令行zip压缩文件或者目录时,取出隐藏文件和系统文件的方法
    Intellij IDEA 13.1.2发布
    springframework中使用ReloadableResourceBundleMessageSource加载properties文件的问题
    Hibernate-Validator 5.1.0.Final 无法解析自定义占位符的问题
    vs2013如何寻找快捷键
    关于c++的命名空间
  • 原文地址:https://www.cnblogs.com/zxh06820/p/12650529.html
Copyright © 2011-2022 走看看