Spring Cloud Netflix 初体验,创建Eureka注册中心和服务提供者(一)
服务注册与发现Eureka 以下将使用 Intellij Spring Initializr
创建
完整pom文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 <?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 https://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.2.2.RELEASE</version > <relativePath /> </parent > <groupId > com.xzt</groupId > <artifactId > cloud-eureka-service</artifactId > <version > 0.0.1-SNAPSHOT</version > <name > cloud-eureka-service</name > <description > Demo project for Spring Boot</description > <properties > <java.version > 1.8</java.version > <spring-cloud.version > Hoxton.RELEASE</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 > <exclusions > <exclusion > <groupId > org.junit.vintage</groupId > <artifactId > junit-vintage-engine</artifactId > </exclusion > </exclusions > </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 >
application.yml 配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 spring: application: name: cloud-eureka-service server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
Application 启动类 添加@EnableEurekaServer
注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package com.xzt.eureka;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication @EnableEurekaServer public class CloudEurekaServiceApplication { public static void main (String[] args) { SpringApplication.run(CloudEurekaServiceApplication.class, args); } }
至此,即可启动 Eureka
注册中心 ,在浏览器输入 http://localhost:8761
即可看到Eureka server界面
创建服务提供者
完整pom文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 <?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 https://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.2.2.RELEASE</version > <relativePath /> </parent > <groupId > com.xzt</groupId > <artifactId > cloud-admin-client</artifactId > <version > 0.0.1-SNAPSHOT</version > <name > cloud-admin-client</name > <description > Demo project for Spring Boot</description > <properties > <java.version > 1.8</java.version > <spring-cloud.version > Hoxton.RELEASE</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 > <exclusions > <exclusion > <groupId > org.junit.vintage</groupId > <artifactId > junit-vintage-engine</artifactId > </exclusion > </exclusions > </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 >
application.yml 配置文件 1 2 3 4 5 6 7 8 9 10 11 spring: application: name: cloud-admin-service server: port: 8762 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
Application 启动类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package com.xzt.admin;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication @EnableEurekaClient public class CloudAdminClientApplication { public static void main (String[] args) { SpringApplication.run(CloudAdminClientApplication.class, args); } }
Controller 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package com.xzt.admin.test;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestController public class AdminController { @Value("${server.port}") private String port; @RequestMapping(value = "hi", method = RequestMethod.GET) public String sayHi (@RequestParam(value = "message") String message) { return String.format("Hi,your message is : %s i am from port : %s" , message, port); } }
启动工程 ,会看到如下界面中多了一个名为 CLOUD-ADMIN-CLIENT
的服务,打开 http://localhost:8762/hi?message=HelloSpring
,你会在浏览器上看到 :
1 Hi,your message is :"HelloSpring" i am from port:8762
总结 在进行接下来的内容之前,需要深度理解一下前面的内容。对此,我提出了下面的一些问题:
为什么要有Eureka?“发现” 是什么意思?
注册中心是所有微服务实例及其位置的数据库。Netflix Eureka 是一个服务注册中心,它提供了一组用于管理服务实例注册和查询可用实例的 REST API。
关于服务发现,参阅4.服务发现
上面的例子中服务提供者已经提供了对外访问接口,假如有n个服务,难道客户端要通过n个不同的接口访问微服务吗?
API 网关是一个服务器,是系统的单入口点。它类似于面向对象设计模式中的门面(Facade)模式。API 网关封装了内部系统架构,并针对每个客户端提供一个定制 API。它还可用于认证、监控、负载均衡、缓存和静态响应处理。参阅 2.API网关
多个不同的服务之间如何通信?
在单体应用中,组件可通过语言级方法或者函数相互调用。相比之下,基于微服务的应用是一个运行在多台机器上的分布式系统。通常,每个服务实例都是一个进程。 服务必须使用进程间通信(IPC)机制进行交互。 参阅 3.进程间通信