zoukankan      html  css  js  c++  java
  • 初识springcloud (一)

    一、springcloud 概述

    1.微服务与springcloud

    微服务是一种架构风格,将单体应用划分为小型的服务单元,微服务之间使用HTTP的API进行访问操作。

    2.springcloud 的主要模块

    • Eureka :基于REST服务的分布式中间件,主要用于服务管理
    • Hystrix : 容错框架,通过添加延迟阈值和容错逻辑,帮助我们控制分布式系统件组件交互。
    • Feign : 一个REST 客户端,目的是为了简化web service  客户端开发。
    • Ribbon : 负载均衡框架,在微服务集群中为各个客户端提供通信支持,它主要实现中间层应用的负载均衡。
    • Zuul :为微服务集群提供代理,过滤,路由等功能。
    • spring cloud config :为分布式系统提供了配置配置服务器和配置客户端。通过他的配置,可以很好的管理集群中的配置文件。
    • spring cloud sleuth :  服务跟踪框架,可以很好的与ZIPkin,ELK等框架整合。
    • spring cloud stream : 用于构建消息驱动微服务框架。
    • spring cloud  bus :  连接RabbitMQ,Kafka等消息代理的集群消息总线。

    二、微服务的发布与调用

    1、Eureka介绍

        Eureka提供基于REST的服务,在集群中主要用于服务器管理。Eureka提供了基于Java语言的客户端组件,并且客户端组件实现了负载均衡的功能。使用该框架,可以将业务组件注册到Eureka容器中,这些组件可进行集群部署,Eureka主要维护这些服务的列表并自动检测他们的状态。

        一个简单的Eureka 集群,需要一个Eureka服务器,若干个服务提供者。可以将业务组件注册到Eureka服务器中,其他客户端组件可以向服务器获取服务并进行远程调用。

    2.写一个简单的Eureka应用

          该程序包括 :

    •  服务器端  : 对于注册到服务端的服务组件,Eureka服务器并没有提供后台的存储,这些注册的服务实例被保存在内存的注册中心,他们通过心跳来保持其最新状态,这些操作可以在内存中完成。客户端存在相同的的机制,同样在内存中保存了注册信息,这样的机制提升了Eureka的性能,每次服务的请求都不必服务端注册中心。     
    •  服务提供者:1、向服务器注册服务 2、发送心跳给服务器 3、向服务器获取注册列表。
    • 服务调用者 :对于发布到Eureka服务器的服务,服务调用者可以对其进行服务查找与调用,服务调用者也是作为客户端存在的,但他的主要职责是发现与调用服务。并且服务调用者可以也是服务提供者。

    构建服务器

    我使用的是IDEA

    建项目步骤

     建好项目之后,在项目启动类中增加@EnableEurekaServer注解,表示该应用是Eureka服务器

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

    启动项目,会发现出现如下错误

    解决这个问题很简单,只需将在application.properties中做如下配置

    server.port = 8761
    # 聲明是否將自己的服務器信息注冊到Eureka服務器上。默認為true
    eureka.client.register-with-eureka=false
    # 是否到Eureka服務器上抓取信息            
    eureka.client.fetch-registry=false  

    再次启动,不在报错。

    然后在浏览器中访问服务器

    服务提供者

    重新建一个项目名为first-service-provider-eureka,方法和上面的一样,启动类添加注解

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

    配置application.properties文件

    #配置實例主機名
    eureka.instance.hostname = localhost
    #  默認地址
    eureka.client.service-url.defaultZone = http://localhost:8761/eureka/  

    编写一个实体类

    @Data
    public class Person {
        private int id;
        private String personName;
        private String personSex;
    }
    

      

    编写一个controller类

    @RestController
    public class FirstController {
        @RequestMapping(value = "/person/{id}",method = RequestMethod.GET)
        public Person getPerson(@PathVariable("id") Integer id){
            Person person = new Person();
            person.setId(id);
            person.setPersonName("curry");
            person.setPersonSex("男");
            return person;
        }
    

      服务调用者

    新建一个项目名为first-service-invoker-eureka,方法同上

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

     @EnableDiscoveryClient 使其具有发现Eureka服务的能力,@EnableEurekaClient 包含了@EnableDiscoveryClient

    编写application.properties

    server.port=9000
    spring.application.name= first-service-invoker
    
    eureka.instance.hostname = localhost
    eureka.client.service-url.defaultZone = http://localhost:8761/eureka/  

    编写controller类

    @RestController
    public class Controller {
        @Bean
        @LoadBalanced
        /**
         * @Method getRestTemplate
         * @Author qinda
         * @Version  1.0
         * @Description    RestTemplate主要是用來調REST服務的,是spring-web模塊下的類
         *                  本身本身不具有調用分佈式的能力。所以用@ LoadBalanced注解 使其具有該能力。
         * @param
         * @Return org.springframework.web.client.RestTemplate
         * @Exception
         * @Date 2019/6/19 18:12
         */
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
         @RequestMapping(value = "/router")
        public String router(){
            RestTemplate restTemplate = getRestTemplate();
            //根據應用名稱調用服務
            String s  = restTemplate.getForObject("http://localhost:8080/person/2",String.class);
             //String json  = restTemplate.getForObject("http://first-service-provider/person/2",String.class);
          
             return s;
        }
        
    }
    

     最后将三个应用都启动,访问服务调用者

    成功。。。。。。。

    再看Eureka容器里

    服务已经存在Eureka中了

    。。。。end

     

  • 相关阅读:
    linux 删除某种规则命名的文件
    adb shell 出现 error :
    android 开发,多个线程共用一个handler
    android 开发上传图片遇到返回 FileNotFoundException
    mysql 的存储过程调试软件
    输入adb shell 时 提示error: more than one device and emulator
    高德开发 android 出现 key 鉴权失败
    android 中设置HttpURLConnection 超时并判断是否超时
    LINQ to SQL语句(3)之Count/Sum/Min/Max/Avg
    C# 如何判断数据是否为 NaN
  • 原文地址:https://www.cnblogs.com/qinda/p/11055073.html
Copyright © 2011-2022 走看看