分类:Spring Cloud

Spring Cloud 学习(三)服务调用

服务调用者需要我们新建一个项目来调用,步骤和前面的client基本相同。

1.完整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>

   <groupId>com.wjy329</groupId>
   <artifactId>eureka-consumer</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>eureka-consumer</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.5.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <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.SR1</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</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>

2.配置文件

application.properties:

spring.application.name=spring-cloud-consumer
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

3.启动类

启动类需要添加@EnableDiscoveryClient@EnableFeignClients 注解

package com.wjy329.eurekaconsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;


@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class EurekaConsumerApplication {

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

4.fegin调用

package com.wjy329.eurekaconsumer.service;


import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @Author wjy329
 * @Time 2018/9/2811:48 AM
 * @description
 */
@FeignClient(name= "wjy-client")
public interface HelloRemote {
    @RequestMapping(value = "/hello")
    public String hello(@RequestParam(value = "name") String name);
}
  • name是远程服务名,与服务提供者的名字需保持一致,方法需和服务提供者的controller方法名和参数个数保持一致。

5.controller

package com.wjy329.eurekaconsumer.controller;

import com.wjy329.eurekaconsumer.service.HelloRemote;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author wjy329
 * @Time 2018/9/2811:51 AM
 * @description
 */

@RestController
public class ConsumerController {

    @Autowired
    HelloRemote helloRemote;

    @RequestMapping("/hello/{name}")
    public String index(@PathVariable("name") String name) {
        return helloRemote.hello(name);
    }

}

到此,服务的注册与调用就基本完成了,我们开始按照注册中心、服务提供、服务消费的顺序依次启动程序。启动成功后,在浏览器输入:localhost:8080/hello?name=123  看到返回结果,说明服务提供者正常;

然后再输入 http://localhost:9001/hello/wjy  看到返回结果,说明调用远程服务成功。

image.png

Spring Cloud 学习(二)服务注册与发现

在第一篇的架构图中,我们可以看到最中间的是服务注册中心,毕竟作为微服务架构,服务提供者和消费者都得通过注册中心来工作,Spring Cloud中的注册中心是Spring Cloud Eureka

 1、Spring Cloud Eureka

  • 基于Netflix Eureka做了二次封装

  • 两个组件组成:

    – Eureka Server 注册中心

    – Eureka Client  服务注册

2、注册中心-Eureka Server

 接下来我们来建一个Eureka Server的项目;

在用idea构建时,我们选择eureka server即可

image.png

创建完成后,我们需要以下几步:

1、查看pom依赖

如果你是按照上述方法创建,那么依赖自动添加了,如果不是按上述方法创建,我们还需要在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.wjy329</groupId>
   <artifactId>eureka</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>eureka</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.5.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <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.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、在启动类上添加@EnableEurekaServer 注解

package com.wjy329.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

3、配置文件

spring.application.name=eureka

server.port=8080
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
  • eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为true。

  • eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true。

  • eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。

这几步完成后,我们启动项目,访问http://localhost:8080 即可。

image.png

3、服务注册-Eureka Client

 由于一段时间我们不需要更改上面server的操作,为了方便,所以我们将上面的server打包成jar包,运行后,方便我们使用。

用控制台进入我们的项目目录,然后执行 mvn clean package 命令,打包项目。

image.png

我这里修改了端口号,一般使用8761端口,然后进入项目的target目录下,执行java -jar 项目.jar 启动服务。

image.png

为了更加方便使用后台运行方式,在控制台中输入  nohup java -jar eureka-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 & 

也可以成功启动注册中心。

和注册中心的步骤大致相同,如下建立项目

image.png

步骤大致也分3步:

1、查看pom依赖

此处pom.xml需要特别注意要加入web的依赖,不然就没有tomcat,就不会启动成功

web依赖:

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

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.wjy329</groupId>
   <artifactId>eureka-client</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>eureka-client</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.5.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <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.SR1</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <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>
   </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、在启动类上加@EnableDiscoveryClient注解

package com.wjy329.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {

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

3、配置文件

#服务名字
spring.application.name=wjy-client
server.port=8080
#注册中心的注册地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

然后我们启动项目,在注册中心可以看到服务注册成功。

image.png

4、Eureka高可用(集群)

一个server确实是不可靠的,万一一个注册中心挂了,那么所有的服务都会没用,所有必须要学会集群。

4.1 双节点注册中心

说白了,就是两个注册中心,即使一个挂了,还有另一个扛着,哈哈。

方法:按照上面注册中心的方法,建两个注册中心,用端口号区分,然后相互注册即可。

1、两个注册中心的配置文件

application1.properties:

spring.application.name=eureka

server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.client.serviceUrl.defaultZone=http://localhost:8762/eureka/

application2.properties:

spring.application.name=eureka2

server.port=8762
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

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

2、服务提供者的配置文件

只需要将之前的配置中多添加一个注册中心的url即可:

spring.application.name=wjy-client
server.port=8080
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

配置完成后,先启动两个注册中心,然后启动client,观察和测试效果。

image.png如图,分别在两个注册中心中都注册了服务。

4.2 集群注册中心

这里指三台及三台以上的情况,其实和双节点一样,在多个配置中心中,每个配置中心需要注册到除了自己外的其他注册中心,比如server1需要配置server2、server3、server4等,而server2需要配置server1、server3、server4等。

1、多个注册中心的配置文件

application1.properties:

spring.application.name=eureka

server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.client.serviceUrl.defaultZone=http://localhost:8762/eureka/,http://localhost:8763/eureka/

application2.properties:

spring.application.name=eureka2

server.port=8762
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8763/eureka/

application3.properties:

spring.application.name=eureka2

server.port=8763
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

2、服务提供者的配置文件

需要加上所有的配置中心:

spring.application.name=wjy-client
server.port=8080
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/

自行测试结果。。。

Spring Cloud 学习(一)微服务介绍

之前了解过Spring Cloud的一系列知识,但是没有做记录,现在从头开始学习一下,记录下来。

1、什么是微服务

1.1 微服务的提出

1.2 微服务原文

  • 一系列微小的服务共同组成

  • 跑在自己的进程里

  • 每个服务为独立的业务开发

  • 独立部署

  • 分布式的管理

1.3 应用架构的发展

dubbo-architecture-roadmap.jpg

单一应用架构=》垂直应用架构=》分布式服务架构=》流动计算架构

这是从dubbo官网弄下来的一张图,这张图可以直观的看出架构的发展。

1.4 分布式定义

旨在支持应用程序和服务的开发,可以利用物理架构由多个自治的处理元素不共享主内存,但通过网络发送消息合作。–Leslie Lamport

1.5 简单的微服务架构

image.png

1.6 微服务架构的基础框架/组件

  • 服务注册发现

  • 服务网关

  • 后端通用服务(也称为中间层服务)

  • 前端服务(也称为边缘服务)

1.7 微服务两大系

阿里系:Dubbo、Zookeeper、SpringMVC\SpringBoot

Spring Cloud:Spring Cloud Netflix Eureka、SpringBoot

2、Spring Cloud是什么

  • Spring Cloud是一个开发工具集,含了多个子项目

    -利用Spring Boot的开发便利

    -主要是基于对Netflix开源组件的进一步封装

  • Spring Cloud简化了分布式开发