在Spring Boot和Gradle项目中设置微服务架构的基础知识

微服务,也被称为微服务架构,是一种建筑风格,结构的应用程序的松散耦合的服务,实现业务功能的集合。微服务架构支持大型复杂应用程序的持续交付/部署,并允许组织发展其技术堆栈。它的主要优点是与部署一起扩展。下面您将找到使用微服务架构构建的简单Web应用程序的基本要素。

1.Spring Boot

Spring Boot可以轻松创建安装了tomcat的独立应用程序,您可以通过启动jar文件来运行它。Spring Boot应用程序不需要任何类型的XML配置; 一切都只使用注释完成。使用Spring Boot创建Web应用程序非常简单。下面,您可以看到一个Spring Boot控制器的示例,这使得使用REST服务创建Web应用程序非常简单:

@Controller
@EnableAutoConfiguration
public class SampleController {
    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }
}

2. Gradle

Gradle是一个类似于Maven和Ant的Java构建工具。Gradle比两者都强大,因为它是Maven和Ant的组合。Gradle不需要任何XML文件,因为它有自己的基于Groovy的DSL。Gradle比Maven或Ant简单明了。我们有build.gradle文件,其中包含Web应用程序所需的所有依赖项。它还包括要与Java,Hibernate和Database版本一起生成的jar名称。以下是build.gradle文件中的代码段:

apply plugin: 'java'
apply plugin: 'checkstyle'
apply plugin: 'findbugs'
apply plugin: 'pmd'
version = '1.0'
repositories {
    mavenCentral()
}
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
}

3. Discovery Server

Discovery Server主要用于将所有微服务客户端连接在一个中心位置,以便它们可以轻松通信。Eureka Discovery从属于服务的每个实例接收心跳消息。如果心跳故障超过可配置的时间表,则通常会从注册表中删除该实例。通过拥有 @EnableDiscoveryClient, 您可以在Spring Boot应用程序中轻松创建发现客户端。

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

对于所有发现客户端,您需要将以下配置添加到每个客户端模块的application.yml中以找到其发现服务器:

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

4. Central Config Server

拥有central-config-server的主要功能是在中央位置存储所有类型的配置属性,这样我们就不需要明确地去每个核心模块来更改属性。它实际上连接到发现服务器,这使得每个核心的微服务都可以轻松获取其属性文件。每当对属性文件进行更改时,我们都可以重新启动此服务器以及其属性文件已更改的核心模块; 您甚至不需要任何类型的核心模块构建来获取更新的属性。您将属性文件放在任何特定位置(Git等),并在application.yml文件中指定属性的路径。下面的代码片段将为您提供Central Config服务器的概述:

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

application.yml

spring:
    profiles:
        active: native
    cloud:
        config:
            server:
                native:
                    searchLocations: file:./properties,classpath:config/

5. Gateway Server

Gateway / Zuul是一项边缘服务,可提供动态路由,监控,弹性,安全性等。其主要目的是为核心微服务提供安全性和路由。我们可以在网关服务器中使用不同类型的过滤器,以便我们可以管理对核心微服务的任何类型的API调用的安全性。它充当核心微服务和外部应用程序之间的代理。

package com.example.EmployeeZuulService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class EmployeeZuulServiceApplication {
   public static void main(String[] args) {
      SpringApplication.run(EmployeeZuulServiceApplication.class, args);
   }
}

application.yml

zuul:
prefix: /application_name
    ignoredServices: "*"
    routes:
    coreservice_name: /coreservice_name/**

6. Orchestra微服务层

在微服务架构中使用这一层是为了结合来自多个核心服务的不同类型的响应,并对数据进行更多处理,然后在响应中发布它们。与所有其他层相比,该层的主要需求较少。它只是一个Spring Boot应用程序,它与发现,网关和微服务进行通信,但没有与数据库部分进行任何类型的交互。

@RestController
@RequestMapping("orchestra")
public class OrchestraController {
  @Autowired
  @LoadBalanced
  protected RestTemplate restTemplate;
  protected Logger LOGGER = LoggerFactory.getLogger(getClass());
  @ApiOperation(value = "Retrieve combined list from two microservices")
  @RequestMapping(value="/combinedlists", method=RequestMethod.GET, produces= MediaType.APPLICATION_JSON_VALUE)
  public ResponseEntity<List<Object>> getCombinedList(HttpServletRequest request) {
    LOGGER.info("Inside getCombinedList method");
    List<Object> combinedList = new ArrayList<>();
    try {
      String url1 = "http://"+"<core_microservice_name1>"+"rest_api_url1";
      String url2 = "http://"+"<core_microservice_name2>"+"rest_api_url2";
      ResponseEntity<List<Object>> result1 = restTemplate.exchange(url1, HttpMethod.GET, null,new ParameterizedTypeReference<List<Object>>() {});
      ResponseEntity<List<Object>> result2 = restTemplate.exchange(url2, HttpMethod.GET, null,new ParameterizedTypeReference<List<Object>>() {});
      List<Object> list1 = result1.getBody();
      List<Object> list2 = result2.getBody();
      combinedList.addAll(list1);
      combinedList.addAll(list2);
    }
    catch(Exception e) {
      LOGGER.error("Exception in getCombinedList method:",e.getMessage());
      return new ResponseEntity<List<Object>>(combinedList,HttpStatus.INTERNAL_SERVER_ERROR);
    }
    LOGGER.info("Exit from getCombinedList method");
    return new ResponseEntity<List<Object>>(combinedList,HttpStatus.OK);
  }
}

7.核心微服务层

这是微服务架构中的最低层,它实际上对数据库执行大量操作并根据需要处理数据。实际的REST服务是在核心层编写的。这部分执行不同事务的每个操作。

它通过@EnableDiscoveryClient 注释与发现有联系 。由于我们已经在中央配置服务器中添加了环境级别配置,因此我们仍然可以在核心模块本身的application.properties中具有应用程序级配置设置/消息。

SampleServiceApplication.java

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

SampleServiceController.java

@RestController
public class RecommendationService {
    private static final Logger LOG = LoggerFactory.getLogger(RecommendationService.class);
    @Autowired
    private SetProcTimeBean setProcTimeBean;
    @Autowired
    private LoadBalancerClient loadBalancer;
private RestTemplate restTemplate = new RestTemplate();
    @RequestMapping("/recommendation")
    public List<Recommendation> getRecommendations(@RequestParam(value = "productId",  required = true) int productId) {
        List<Recommendation> list = new ArrayList<>();
        list.add(new Recommendation(productId, 1, "Author 1", 1, "Content 1"));
        list.add(new Recommendation(productId, 2, "Author 2", 2, "Content 2"));
        list.add(new Recommendation(productId, 3, "Author 3", 3, "Content 3"));
        return list;
    }
}

application.yml

server:
  port: 7878
eureka:
  instance:
    leaseRenewalIntervalInSeconds: 10
    metadataMap:
      instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${random.value}}}
  client:
    registryFetchIntervalSeconds: 5

bootstrap.yml

spring:
  application:
    name: sample
  cloud:
    config:
      enabled: true
      discovery:
        enabled: true
        serviceId: central-config-server

原文标题《Basics for Setting Up a Microservices Architecture in a Project for Spring Boot and Gradle》

作者:Akash Bhingole

译者:February

不代表云加社区观点,更多详情请查看原文链接

原文链接:https://dzone.com/articles/basic-things-to-setup-an-microservices-architectur

原文作者:Akash Bhingole

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

Spring Boot实战之基础回顾 原

Java EE,Java平台企业版(Java Platform Enterprise Edition),之前称为Java 2 Platform, Enterpr...

10010
来自专栏全栈架构

Spring Boot与Kotlin使用Spring Data Rest创建HAL风格Restful接口

REST web服务已成为在web上应用程序集成的首选方式。在其核心中,REST定义了系统由客户端交互的资源组成。这些资源以超媒体驱动的方式实现。Spring ...

10920
来自专栏Linyb极客之路

Spring Boot和Hazelcast使用

要将Hazelcast添加到Spring Boot应用程序,只需要两个依赖项。下我们需要配置Hazelcast实例。有两种方法可以做到这一点: 1. 通过Ja...

27520
来自专栏about云

让你快速认识flume及安装和使用flume1.5传输数据(日志)到hadoop2.2

问题导读: 1.什么是flume? 2.如何安装flume? 3.flume的配置文件与其它软件有什么不同? 一、认识flume 1.flume是什么? ...

402130
来自专栏大闲人柴毛毛

Spring速查手册——Bean装配

Spring提供三种Bean的装配方式,分别是: 1. 自动装配Bean 2. 在Java中装配Bean 3. 在XML中装配Bean 1. 自动...

37780
来自专栏吴生的专栏

使用 maven 生成一个支持端到端自动测试的 RESTful 服务项目脚手架

和传统后端页面生成技术相较, RESTful 数据服务专注与数据逻辑, 而将数据呈现完全交给前端应用. 这样做可以让后端开发更加单纯, 而且更容易测试. 本文将...

37350
来自专栏互联网技术栈

Spring Boot 2.0 Release Notes 中文版

由于1.5版本是Spring Boot的主要版本,所有升级现有的应用程序可能会比平常更复杂一点。我们制定了专门的迁移指南来帮助您升级现有的Spring Boot...

16720
来自专栏程序猿DD

Why Spring Boot

本文介绍将各种Spring的配置方式,帮助您了解配置Spring应用的复杂性。 Spring是一个非常受欢迎的Java框架,它用于构建web和企业应用。不像许多...

44070
来自专栏程序猿DD

Spring Cloud构建微服务架构:服务消费者

通过上一篇《Spring Cloud构建微服务架构:服务注册与发现》,我们已经成功地将服务提供者:compute-service服务注册到Eureka服务注册中...

24550
来自专栏计算机编程

Jenkins mac上配置原生android

请在gradle中配置好打包的key与alias的值,否则上面的打包方式打出来的包无法安装!

27010

扫码关注云+社区

领取腾讯云代金券