简单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为对应的服务名

原文地址:https://www.cnblogs.com/salmonLeeson/p/11881093.html

时间: 2024-10-12 11:56:02

简单Spring Cloud 微服务框架搭建的相关文章

Spring Cloud微服务框架 实战企业级优惠券系统

第1章 课程介绍[终于等到你,快来认识我]本章中将对课程中涉及到的技术.工具.业务等进行简单介绍. 第2章 准备工作[工欲善其事,必先利其器]本章中将对课程中使用到的技术工具做介绍,包括Maven.MySQL.Redis.Kafka:会对它们的功能.安装.基本的使用方法进行介绍. 第3章 SpringBoot 开发框架[基础打不牢,学问攀不高]课程主体业务使用SpringCloud框架开发实现,但是SpringCloud基于SpringBoot实现.为便于更顺畅学习,本章中会对SpringBoo

浅谈现公司的Spring Cloud微服务框架

目录 说在前面 服务注册与发现 服务网关及熔断 配置中心 消息中心.服务链路追踪 小言 说在前面 本文偏小白,大佬慎入,若有错误或者质疑,欢迎留言提问,谢谢,祝大家新年快乐. spring cloud Spring Cloud 是将分布式系统中一系列基础框架/工具进行整合的框架.其中包含: 服务注册与发现.服务网关.熔断器.配置中心.消息中心.服务链路追踪等等 .这也是一个服务化架构的最小组成元素,有了这些基本的组成要素,就可以实现一个最简单的服务架构. Spring Cloud 并没有重复造轮

Spring Cloud 微服务中搭建 OAuth2.0 认证授权服务

在使用 Spring Cloud 体系来构建微服务的过程中,用户请求是通过网关(ZUUL 或 Spring APIGateway)以 HTTP 协议来传输信息,API 网关将自己注册为 Eureka 服务治理下的应用,同时也从 Eureka 服务中获取所有其他微服务的实例信息.搭建 OAuth2 认证授权服务,并不是给每个微服务调用,而是通过 API 网关进行统一调用来对网关后的微服务做前置过滤,所有的请求都必须先通过 API 网关,API 网关在进行路由转发之前对该请求进行前置校验,实现对微服

spring cloud微服务分布式云架构 - Spring Cloud简介

Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了一部分),都可以用Spring Boot的开发风格做到一键启动和部署.Spring Cloud将目前比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终整合出一套简单易懂.易部署和易维护的分布式系统架构平台. Spring Clou

(一)spring cloud微服务分布式云架构 - Spring Cloud简介

Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了一部分),都可以用Spring Boot的开发风格做到一键启动和部署.Spring Cloud将目前比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终整合出一套简单易懂.易部署和易维护的分布式系统架构平台. Spring Clou

Spring Cloud微服务中网关服务是如何实现的?(Zuul篇)

导读 我们知道在基于Spring Cloud的微服务体系中,各个微服务除了在内部提供服务外,有些服务接口还需要直接提供给客户端,如Andirod.IOS.H5等等. 而一个很尴尬的境地是,如果直接将提供外部接口的微服务暴露给公网,那么意味着为了增强这个微服务的安全性,需要做很多额外的安全性措施,如报文数字签名.加密等:而大部分场景下,微服务本身又是提供给内部其他微服务调用的,即便所有的微服务都会不同程度地直接面向App客户端提供公网服务,那么为了这确保这些微服务的安全性,涉及的微服务也都需要实现

Spring cloud微服务安全实战

第1章 课程导学我们会对整个课程的内容做一个简要的介绍,包括章节的安排,使用的主要技术栈,实战案例的介绍以及前置知识的介绍等内容. 第2章 环境搭建开发工具的介绍及安装,介绍项目代码结构并搭建,基本的依赖和参数设置. 第3章 API安全我们从简单的API场景入手,讲述API安全相关的知识.首先我们会介绍要保证一个API安全都需要考虑哪些问题,然后我们针对这些问题介绍常见的安全机制,我们会针对每种问题和安全机制编写相应的代码,让大家对这些问题和安全机制有一个初步的认识.... 第4章 微服务网关安

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四.服务间通信与集成 五.服务智能路由 六.集中配置管理 七.高可用和容错 八.监控和日志 九.服务的部署和发布策略 微服务概述 单体应用通常指在一个程序中满足多个业务或技术领域的需求,不同的需求领域内化为模块.假定我们要开发一个Web应用,通常的MVC模式可以满足要求.针对不同领域有不少代码生成工具

关于Spring Cloud微服务架构

微服务架构 Spring Cloud解决的第一个问题就是:服务与服务之间的解耦.很多公司在业务高速发展的时候,服务组件也会相应的不断增加.服务和服务之间有着复杂的相互调用关系,经常有服务A调用服务B,服务B调用服务C和服务D ...,随着服务化组件的不断增多,服务之间的调用关系成指数级别的增长,这样最容易导致的情况就是牵一发而动全身.经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发.这时候就应该进行服务治理,将服务之间的直接依赖转化为服务对服务中心的依赖.Spring Cloud