• 简单Spring Cloud 微服务框架搭建


    微服务是现在比较流行的技术,对于程序猿而言,了解并搭建一个基本的微服务框架是很有必要滴。

    微服务包含的内容非常多,一般小伙伴们可以根据自己的需求不断添加各种组件、框架。

    一般情况下,基本的微服务框架包含:框架:注册中心、负载均衡、声明式服务(feign)、容错(hystrix)、网关(权限)gateway 和 配置(resource)

    注册中心:现在比较常用的有eureka、nacos

    负载均衡:包括feign、ribbon等技术,相关对比可以参考另一位老哥的博客:《负载均衡之feign与ribbon对比》

    服务间调用:包括resttemplate、feign等等

    熔断:hystrix

    网关:gateway,(zuul已经逐渐被弃用)

    配置中心:config server 、 config clent

    本章主要采用 eureka+feign+hystrix+gateway+config 的组合搭建一个基础框架,环境采用idea。

    注册中心 

    首先新建一个spring工程,spring-boot版本可以选择, 2.1.9.RELEASE。

    在新建的project上右键,新建module,选择Spring Initializr

    下一步,设置对应的包名,artifact名称,这些可以根据自己的项目需要自己命名。

    next,

     然后下一步,完成即可。这种方式是直接将Spring管网上对应的module下载到你的项目中,非常方便。

    然后再application.yml文件中设置你对应的注册中心的端口,访问方式等信息。

    server:
      port: 8761
    
    eureka:
      instance:
    
        hostname: localhost
      client:
        #自己是注册中心,不需要注册自己
        registerWithEureka: false
        #自己是注册中心不需要发现服务
        fetchRegistry: false
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

    在启动类中加入对应注解:

    @SpringBootApplication
    //声明自己是注册中心
    @EnableEurekaServer
    public class HsddEurekaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HsddEurekaApplication.class, args);
        }
    
    }
    

      

     业务逻辑服务 

    业务逻辑服务可以按功能或逻辑进行分类,分成多个微服务来提供,保证整体的可用性。

    在project中新建一个目录,比如,service目录。将业务逻辑相关的微服务都放到这里面。

    新建spring boot modul,同上面一样,不过可以不选spring cloud配置项。

     然后再main.java下面创建对应的各层目录,这里没啥好说的。

    在application启动类中,我们需要添加对应注解,

    package com.fencer.userdemo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableEurekaClient  #注册到注册中心
    @EnableFeignClients  #服务间负载均衡与声名式服务
    public class UserDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(UserDemoApplication.class, args);
        }
    
    } 

    在业务逻辑微服务中,需要置application.yml,需要将你的服务注册到注册中心,才能被发现调用

    #服务端口
    server:
      port: 8762
    
    spring:
      application:
        name: user-demo   #注册的服务名称
      profiles:
        active: dev
      devtools:
        restart:
          enabled: true
          trigger-file: devtools.tg
    
    #注册中心地址
    eureka:
      instance:
        prefer-ip-address: true
        instance-id: 127.0.0.1:${server.port}
        hostname: localhost
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
        register-with-eureka: true
        fetch-registry: true
    

      

     服务间声明式调用及熔断

    服务间声明式调用及熔断比较简单,

    新建一个业务逻辑服务,在启动类中加入feign、hystrix相关注解

    package com.fencer.orderdemo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients  
    @EnableHystrix  //熔断
    public class OrderDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderDemoApplication.class, args);
        }
    
    }
    

      创建一个调用对象的接口,接口与服务提供方,方法名、参数完全一致

    package com.fencer.orderdemo.service;
    
    import com.fencer.orderdemo.fallback.MyFallback;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    /**
     * @author : 
     * @version V1.0
     * @Project: hsdd
     * @Package com.fencer.orderdemo.service
     * @Description: TODO
     * @date Date : 2019年10月23日 19:49
     */
    @FeignClient(value = "user-demo", fallback = MyFallback.class)
    public interface UserDemoFeignService {
    
        @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
        String getUser(@PathVariable("id") int id);
    
        @RequestMapping(value = "/hi", method = RequestMethod.GET)
        String home(@RequestParam String name);
    }
    

      添加统一降级处理方法,在服务提供方没有响应时进行处理。

    package com.fencer.orderdemo.fallback;
    
    import com.fencer.orderdemo.service.UserDemoFeignService;
    import org.springframework.stereotype.Component;
    
    /**
     * @author : 
     * @version V1.0
     * @Project: hsdd
     * @Package
     * @Description: TODO
     * @date Date : 2019年10月24日 10:46
     */
    @Component
    public class MyFallback implements UserDemoFeignService {
    
        //    添加服务降级处理方法
        @Override
        public String getUser(int id) {
            return "error getUser";
        }
    
        @Override
        public String home(String name) {
            return "error home Method";
        }
    }
    

      在application.yml中配置feign相关配置项

    #服务启动端口号
    server:
      port: 8763
    #服务名称
    spring:
      application:
        name: order-demo
    
    #服务注册到eureka服务端地址
    eureka:
      instance:
        prefer-ip-address: true
      #    instance-id: 127.0.0.1:${server.port}
      #    hostname: localhost
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
        register-with-eureka: true
        fetch-registry: true
    
    feign:
      hystrix:
        enabled: true #允许开启hystrix功能
      compression:
        request:
          enabled: true #开启请求压缩
          mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
          min-request-size: 2048 # 设置触发压缩的大小下限
        response:
          enabled: true #开启响应压缩
      client:
        config:
          default:
            connectTimeout: 10000   #连接超时时间(ms)
            readTimeout: 10000      # 通信超时时间(ms)
    
    #ribbon:
    #  ConnectTimeout: 5000 # 连接超时时间(ms)
    #  ReadTimeout: 5000 # 通信超时时间(ms)
    #  OkToRetryOnAllOperations: true # 是否对所有操作重试
    #  MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数
    #  MaxAutoRetries: 1 # 同一实例的重试次数
    

     

     网关gateway

    新建一个网关服务

     在pom中需要加入对应依赖

    <!-- 引入gateway网关依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
    
            <!--  添加eureka注册中心客户端依赖 -->
            <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-hystrix</artifactId>
            </dependency>
    
            <!-- 监控中心 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    

      网关的重点在yml配置文件中,

    server:
      port: 8081
    
    spring:
      application:
        name: hsdd-gateway
      cloud:
        gateway:
          discovery:
            locator:
              ##gateway开启服务注册和发现的功能
              enabled: true
              ##将请求路径上的服务名配置为小写
              lower-case-service-id: true
    
    #eureka注册地址
    eureka:
      instance:
        prefer-ip-address: true
        instance-id: 127.0.0.1:${server.port}
        hostname: localhost
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
    
    logging:
      level:
        org.springframework.cloud.gateway: debug
        org.springframework.http.server.reactive: debug
        org.springframework.web.reactive: debug
        reactor.ipc.netty: debug
    
    feign:
      hystrix:
        enabled: true
    

      

    spring:
      cloud:
        gateway:
          routes:
          - id: test
            uri: http://www.ityouknow.com/springcloud
            predicates:
            - Path=/user/**
    

      以上两种方式都可以进行网关配置。第一种时自动发现注册服务,服务名为你自己命名的微服务名称

    第二种,需要手动配置,在Path中配置上关键字,uri为对应的服务名

  • 相关阅读:
    k8s之Controller Manager(七)
    k8s 之apiserver部署(六)
    k8s之etcd集群安装(五)
    k8s 之harbor仓库安装(四)
    k8s 之docker环境部署 (三)
    如何在PPT中同时插入多张图片且每张占一页
    ICMPV6
    整理桌面 | Windows自带工具
    教你在Linux中如何配置网络地址
    解决在gns3中wireshark抓包无法显示和实时刷新问题
  • 原文地址:https://www.cnblogs.com/salmonLeeson/p/11881093.html
Copyright © 2020-2023  润新知