SprngCloud微服务框架搭建(一)

参照来源 :https://blog.csdn.net/forezp/article/details/70148833

1、简介

目前来说,SpringCloud是比较完整的微服务解决方案框架。不像其他rpc远程调用框架,只是解决某个微服务中的问题。

2、微服务框架搭建

2.1、服务的注册与发现Eureka(Finchley版本)

本次采用Eureka作为服务注册与发现的组件。

2.1.1、创建服务注册中心

首先创建一个空的maven工程,在其pom文件引入依赖,

Spring Boot 版本采用  2.0.3.RELEASE。

Spring Cloud 版本采用 Finchley.RELEASE。

这个pom文件作为父pom文件,起到依赖版本控制的作用,其他module工程继承该pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ucredit</groupId>
    <artifactId>dataPlatform</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>

    <modules>
        <module>eureka-server</module>
        <module>eureka-client</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.1.2 创建两个model工程

一个model工程作为服务注册中心,即Eureka Server,另一个作为 Eureka Client 。

先创建server,邮件工程 -> 创建 model  ->  选择 spring initializr(如图)

下一步 -> 选择 cloud discovery -> eureka server ,然后一直下一步就行了。

创建完成后的工程,其pom.xml继承了父pom文件,并引入  spring-cloud-starter-netflix-eureka-server 的依赖,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.1.3.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.ucredit</groupId>
   <artifactId>eureka-server</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>eureka-server</name>
   <description>Demo project for Spring Boot</description>

   <properties>
      <java.version>1.8</java.version>
      <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

2.1.3 启动一个服务注册中心

只需要一个注解  @EnableEurekaServer,这个注解需要加在SpringBoot工程的启动 Application 类上加载:

/**
 *  eureka server 是有界面的,启动工程,打开浏览器访问:
 *  http://localhost:8761
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaSeverApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaSeverApplication.class, args);
    }
}

2.1.4 修改配置文件

Eureka 是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下 eureka server 也是一个

eureka client ,必须要指定一个server。 eureka server的配置文件 application.yml:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
  application:
    name: eurka-server

通过 eureka.client.registerWithEureka:false,和 fetchRegistry:false来表明自己是一个eureka server。

2.1.5 eureka server 是有界面的,启动工程,打开浏览器访问: http://localhost:8761/,界面如下:

No application available 没有服务被发现 ...

因为没有注册服务当然不可能有服务发现了 。。。

2.1.6 创建一个服务提供者(eureka client)

当client 向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。eureka server 从每个client实例接收心跳信息。如果心跳超时,则通常将该实例从注册中心删除。

创建过程同server类似,创建完pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.ucredit</groupId>
    <artifactId>eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

通过注解 @EnableEurekaClient 表明自己是一个eurekaclient。

package com.ucredit.eurekaclient;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@RestController

/**
 * 通过注解@EnableEurekaClient 表明自己是一个eurekaclient.
 * 仅仅@EnableEurekaClient是不够的,还需要在配置文件中注明自己的服务注册中心的地址
 */
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

    //读取配置文件
    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String home(@RequestParam(value = "name", defaultValue = "forezp") String name) {
        return "hi " + name + " ,i am from port:" + port;
    }
}

仅仅@EnableEurekaClient 是不够的,还需要在配置文件中注明自己的服务注册中心的地址。

server:
  port: 8762

spring:
  application:
    name: eureka-client

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

需要指明 spring.application.name 和这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name。

启动工程,打开 http://localhost:8761/ ,即 eureka server的网址。

你会发现一个服务已经注册在服务中了,服务名为 EUREKA-CLIENT,端口号是 8762。这时打开浏览器 http://localhost:8762/hi?name=forezp ,

会在浏览器中看到:

2.2 服务消费者(rest+ribbon)(Finchley版本)

2.2.1 讲了服务的注册与发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于htttp restful的。

Spring Cloud 有两种服务的调用方式:一种是ribbon + restTemplate,另一种是feign。在此讲述基于 ribbon + rest。

Ribbon 是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。

Feign 默认集成了ribbon。

2.2.2 准备工作

这一篇基于上一篇的工程,启动 eureka-server工程,启动 server-client工程,它的端口号为8762,将server-client的配置文件的端口改为8763,并启动,这时你会发现:

server-client 在 eureka-server 注册了2个实例,这就相当于一个小的集群了。

如何一个工程启动多实例,请看:

https://blog.csdn.net/forezp/article/details/76408139

2.2.3 建一个服务消费者。

重新新建一个spring-boot工程,取名service-ribbon,在它的pom.xm继承了父pom文件,并引入了以下依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.1.3.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.ucredit</groupId>
   <artifactId>server-ribbon</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>server-ribbon</name>
   <description>Demo project for Spring Boot</description>

   <properties>
      <java.version>1.8</java.version>
      <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-web</artifactId>
         <version>4.3.18.RELEASE</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-netflix-eureka-client</artifactId>
         <version>RELEASE</version>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

在工程的配置文件指定服务的注册中心地址为  http://localhost:8761/eureka

程序名称为 eureka-ribbon,程序端口为8764。配置文件 application.yml 如下:

server:
  port: 8764

spring:
  application:
    name: eureka-ribbon

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

在工程的启动类中,通过 @EnableDiscoveryClient 向服务中心注册,并且向程序IOC注入一个bean:restTemplate

并通过 @LoadBalanced 注解表名这个 restTemplate开启负载均衡的功能。

 package com.ucredit.serverribbon;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableEurekaClient //表名自己是一个eureka客户端
    public class ServerRibbonApplication {

        public static void main(String[] args) {
            SpringApplication.run(ServerRibbonApplication.class, args);
        }

        @Bean
        @LoadBalanced
        RestTemplate restTemplate() {
            return new RestTemplate();
        }

    }

写一个测试类,HelloService,通过之前注入ioc容器的restTemplate来消费 eureka-client 服务的 "/hi" 接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候回用具体的url替换掉服务名。

package com.ucredit.serverribbon.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    public String hiService(String name) {
        return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
    }

}

写一个controller ,在controller中调用 HelloService

package com.ucredit.serverribbon.controller;

import com.ucredit.serverribbon.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloControler {
    @Autowired
    HelloService helloService;

    @GetMapping(value = "/hi")
    public String hi(@RequestParam String name) {
        return helloService.hiService( name );
    }

}

在浏览器中访问 http://localhost:8764/hi?name=forezp ,浏览器交替显示:

这说明当我们调用 restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class); 
方法时,已经做了负载均衡,访问了不同的端口的服务实例。

2.2.4 此时的架构

一个服务注册中心,eureka server,端口为8761

service-hi 工程跑了两个实例,端口分别为8762,8763,分别向服务注册中心注册。

service-ribbon 端口为8764,向服务注册中心注册。

当service-ribbon 通过 restTemplate 调用 service-hi的 hi 接口时,因为ribbon 进行了负载均衡,会轮流的调用 service-hi:8762和8763两个端口的hi接口。

 

原文地址:https://www.cnblogs.com/ssqq5200936/p/10761278.html

时间: 2024-10-06 17:09:22

SprngCloud微服务框架搭建(一)的相关文章

简单Spring Cloud 微服务框架搭建

微服务是现在比较流行的技术,对于程序猿而言,了解并搭建一个基本的微服务框架是很有必要滴. 微服务包含的内容非常多,一般小伙伴们可以根据自己的需求不断添加各种组件.框架. 一般情况下,基本的微服务框架包含:框架:注册中心.负载均衡.声明式服务(feign).容错(hystrix).网关(权限)gateway 和 配置(resource) 注册中心:现在比较常用的有eureka.nacos 负载均衡:包括feign.ribbon等技术,相关对比可以参考另一位老哥的博客:<负载均衡之feign与rib

微服务框架搭建

技术 作用 计划完成时间 实际完成时间 是否完成 Spring Cloud Netflix Eureka 服务治理 2020/2/2 2020/2/2 完成 Spring Cloud Netflix Feign 服务间通信 2020/2/3     Spring Cloud Netflix Ribbon   2020/2/4      Spring Cloud Netflix Hystrix   2020/2/4      Spring Cloud Zuul   2020/2/5      Sp

微服务框架学习收录链接(包括服务搭建中用到mybatis-plus等)

1.基于Spring Boot和Spring Cloud实现微服务架构学习(一)-Spring框架介绍 https://blog.csdn.net/zeb_perfect/article/details/51945350 2.Spring Cloud生态圈简介 https://blog.csdn.net/rickiyeat/article/details/59172258 3.标题:Spring Boot 快速搭建微服务框架详细教程 http://www.jb51.net/article/123

【干货】手动搭建一套可自动化构建的微服务框架

如何阅读 本文篇幅较长,我花了两天的时间完成,大约需要半小时阅读. 本文分为理论篇和实践篇,由于代码在手机端展示并不理想,建议大家收藏之后在PC端阅读.实践篇边动手边阅读更有助于理解. 在阅读的同时,也麻烦各位大佬多多分享! 本文你将学到什么? 本文将以原理+实战的方式,首先对"微服务"相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构你的整个应用程序将会被拆分成一个个功能独立的子系统,独立运行

(转)微服务框架落地实践之路

http://www.primeton.com/read.php?id=2276&his=1 一.微服务架构产生的背景 近十年中,互联网给我们生活带来了翻天覆地的变化,消费者的生活方式日益数字化,人们可以在任何时间.任何地点利用网络进行购物体验,运用社交媒体进行自我表达,企业也在运用多种技术手段,发挥数字化潜力,改善客户联系,促进企业业务模式的转型.在这种背景下,互联网也好,传统企业也罢,都面临一个共同的需求:面对快速变化的需求,面对业务模式的升级,如何构建出灵活的,可扩展,可重用的系统? 前几

日调度万亿次,微服务框架TSF大规模应用——云+未来峰会开发者专场回顾

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 演讲者:张浩 腾讯云中间件产品负责人 背景:众多开发者中,一定经历类似的甜蜜烦恼,就是当线上业务规模越来越大,系统分支发展越来越多的时候,初期上线的成就感很快就会被系统间数据不兼容.不通畅,折磨得精疲力尽,每次模块更新都是牵一发而动全身.腾讯云微服务框架TSF就可以为大家解决数据孤岛以及重复造轮子的问题,提供了简洁易用的代码入口,将复杂的底层网络.服务器部署接口化,使开发者更易用. 本文整理自腾讯云中间件产品负责人张浩在腾讯云云+未来峰

从 Spring Cloud 看一个微服务框架的「五脏六腑」

原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组合的框架.因为与构建微服务本身没有直接关系,所以本文不对 Spring Boot 进行展开.另外本文有一些例子涉及到 Spring 和 Spring Boot,建议先了解一下 Spring 和 Spri

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

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

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

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