上一篇,我们介绍了服务注册中心,光有服务注册中心没有用,我们得发服务注册上去,得从它那边获取服务。下面我们注册一个服务到服务注册中心上去。

我们创建一个 hello-service 的 spring boot 项目,

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.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jp</groupId>
<artifactId>hello-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hello-service</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging> <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-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>

启动类:

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

我们这里用的是 @EnableEurekaClient 从名字上就知道,这是一个Eureka客户端.

我们创建一个controller ,供外部访问

@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() throws InterruptedException { return "this a hello server";
}
}

application.properties 配置内容如下:

spring.application.name=hello-service
server.port=9011
#注册中心地址
eureka.client.serviceUrl.defaultZone=http://peer1:9001/eureka/,http://peer2:9002/eureka/
#服务实例元数据,设置实例名,区分同一服务中不同实例的唯一标识
eureka.instance.instance-id= ${spring.cloud.client.ip-address}:${server.port}
#启用注册IP
eureka.instance.prefer-ip-address=true

这里我们服务中心的地址指定了两个,就是我们之前创建的两个服务注册中心

我们把之前的两个服务注册中心都启动,再把我们的 hello-service服务也启动,可以看到,我们的hello-service服务也注册上去了。

下面我们演示服务发现,我们假设有一个 service-a 服务需要调用 hello-service 服务的hello接口,我们以前的做法是 直接 http://localhost:9011/hello  通过地址调用,但是现在我们有服务注册中心,里面有我们的服务,我们通过服务注册中心来调我们的服务

我们来创建一个 service-a 项目

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.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jp</groupId>
<artifactId>service-a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-a</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging> <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-server</artifactId>
</dependency> <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>
</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>

启动类:

@SpringBootApplication
@EnableEurekaClient
public class ServiceAApplication { public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
} /**
* LoadBalanced注解是给RestTemplate做标记的,
* 以使用负载均衡的客户端来(LoadBalancedClient)配置他
* @return
*/
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}

这里我们创建了一个 RestTemplate Bean,这玩意就是将你的通信请求简单化,不要你去编写一大堆代码,点击去看下源码就明白了,很好理解,我在controller里面做了简单说明

我们又在RestTemplate加上了 @LoadBalanced 注解,意思是在RestTemplate请求的时候加上负载均衡,已负载均衡的方式访问服务。

Controller 类:

@RestController
public class ConsumerController { @Autowired
RestTemplate restTemplate; @RequestMapping("/hello")
public Object hello(){
/**
* 这里的请求地址是:
* 服务实例名/路由地址
* 可以以 GET,POST,PUT,DELETE的方式请求,对应着获取,提交,修改,删除操作
*/
return restTemplate.getForEntity("http://hello-service/hello",String.class).getBody(); /**
* GET 请求
* 带参数的GET请求,可以传多个参数,下标从1开始
* 第一个参数是请求地址,第二个是返回类型,第三个是地址里面的参数
* restTemplate.getForEntity("http://hello-service/user?name={1}",User.class,"jp").getBody();
* 有三种方式的重载,详见代码
*
* 当返回是个对象时,可以这么做
* User user = restTemplate.getForObject("http://hello-service/user?name={1}",User.class,"jp")
*
* POST 请求
* post请求和get请求大致相同
* 第一个参数是请求地址,第二个参数是要提交的数据,第三个参数是返回类型
* User user = New User("jp",18);
* ResponseEntity<String> response = restTemplate.postForEntity("http://hello-service/adduser",user,String.class);
* String body = response.getBody();
*
* PUT 跟POST 请求一致
*
* DELETE 请求
* 由于我们通常都是通过唯一标识符去删除数据,基本斗都把参数拼接在url中,所以不需要request数据
* delete 请求不需要返回
* restTemplate.delete("http://hello-service/user?name={1}","d");
*
*/
}
}

从代码中我们可以发现,我们调用请求并不是以前我们IP+端口的形式,是 实例名/路由地址 的形式。这样的好处是,可以快速的部署,减少了出问题的可能。

application.properties 配置内容如下:

spring.application.name=service-a
server.port=9021
#注册中心地址
eureka.client.serviceUrl.defaultZone=http://peer1:9001/eureka/,http://peer2:9002/eureka/
#服务实例元数据,设置实例名,区分同一服务中不同实例的唯一标识
eureka.instance.instance-id= ${spring.cloud.client.ip-address}:${server.port}
#启用注册IP
eureka.instance.prefer-ip-address=true

我们把两个服务注册中心启起来,再把 hello-service 运行,最后把servie-a 运行,然后我们看下服务注册中心都有我们的服务了

我们调用 service-a 的hello 接口,看会不会返还 hello-service 接口的结果 ,我们打开  http://localhost:9021/hello

看到我们正确的返回了结果,我们到这里服务注册中心和服务注册,服务发现已经演示完毕了

SpringCloud系列(一):Eureka 服务注册与服务发现的更多相关文章

  1. SpringCloud之eureka服务注册和服务发现

    服务注册中心 :eureka-server 作用:服务注册中心提供服务注册功能 服务提供方:eureka-client 作用:注册服务到服务注册中心 服务注册中心 :eureka-server 创建 ...

  2. SpringCloud实战之初级入门(二)— 服务注册与服务调用

    目录 1.环境介绍 2.服务提供 2.1 创建工程 2.2 修改配置文件 2.3 修改启动文件 2.5 亲测注意事项 3.服务调用 3.1 创建工程 3.2 修改配置文件 3.3 修改启动文件 3.4 ...

  3. SpringCloud+Consul 服务注册与服务发现

    SpringCloud+Consul 服务注册与服务发现 1. 服务注册: 在Spring.factories有一段: # Discovery Client Configuration org.spr ...

  4. 【转】用 Consul 来做服务注册与服务发现

    原文:https://segmentfault.com/a/1190000018731395?utm_source=tag-newest ------------------------------- ...

  5. consul服务注册与服务发现的巨坑

    最近使用consul作为项目的服务注册与服务发现的基础功能.在塔建集群使用中遇到一些坑,下面一个个的记录下来. consul集群多node consul集群的node也就是我们所说的consul实例. ...

  6. dubbo2.7.X版本带来的服务注册和服务调用方式改变

    参考地址:https://www.cnblogs.com/alisystemsoftware/p/13064620.html 注册中心数据结构格式改变(service:接口服务,application ...

  7. Go微服务框架go-kratos实战04:kratos中服务注册和服务发现的使用

    一.简介 关于服务注册和服务发现介绍,我前面的文章有介绍过 - 服务注册和发现的文章. 作为服务中心的软件有很多,比如 etcd,consul,nacos,zookeeper 等都可以作为服务中心. ...

  8. SpringCloud系列使用Eureka进行服务治理

    1. 什么是微服务? "微服务"一词来自国外的一篇博文,网站:https://martinfowler.com/articles/microservices.html 如果您不能看 ...

  9. 《springCloud系列》——Eureka 进行服务治理

    整理一下: @EnableEurekaServer 注册中心 @EnableDiscoveryClient 提供服务 @EnableFeignClients 消费者(Feign特有的,而且他自带断路器 ...

随机推荐

  1. 一、基础篇--1.2Java集合-List、Set、Map区别

     List.Set.Map区别 三者关系如下: 结构特点 1.List和Set是存储单列数据集合,Map是存储键值对这样的双列数据集合: 2.List中存储的数据都是有序的,并且允许重复:Map中存储 ...

  2. UVa 839 -- Not so Mobile(树的递归输入)

    UVa 839 Not so Mobile(树的递归输入) 判断一个树状天平是否平衡,每个测试样例每行4个数 wl,dl,wr,dr,当wl*dl=wr*dr时,视为这个天平平衡,当wl或wr等于0是 ...

  3. 服务器被攻击后当作矿机,高WIO

    __ 矿机特点:    操作系统反应慢. wio 非常高,一般轻松达到50%,甚至达到100%. 在/root/ 下存在 .ddg 隐藏路径.路径中有nnnn.db 二进制文件. /tmp ./usr ...

  4. spark2.2 中文文档

    http://spark.apachecn.org/#/docs/7?id=从-spark-sql-20-升级到-21

  5. WPF 使用Task代替ThreadPool和Thread

    一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...

  6. rocketMQ retry 消息的实现

    consumer 消费失败,会把消息重新发往 %RETRY% + consumerGroup,这个 retry 消息会在一定时间后,真实送到 retry topic. broker 处理发送到 ret ...

  7. 64位编译器下,将指针转换成UINT32,不需要修改编译选项的编码方式

    一些严格的64位编译器,将指针转换成UINT32,会报各种丢失精度的错误. 但很显然,有些时候,我们就是需要转换,且并不会真正丢失精度. 此时不需要修改编译选项的编码方式,有些用处了 示例如下: un ...

  8. IOS CocoaPods的用法

    自从有了CocoaPods以后,这些繁杂的工作就不再需要我们亲力亲为了,只需要我们做好少量的配置工作,CocoaPods会为我们做好一切   一.什么是CocoaPods 1.为什么需要CocoaPo ...

  9. VGA显示正圆

    接着上次的随笔,既然VGA时序已经实现了,那么就显示点东西看看吧. 想显示个圆,但是无从下手,参考了这篇文章:https://user.qzone.qq.com/1241003385/blog/154 ...

  10. #Java学习之路——基础阶段二(第十二篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...