一、Eureka的作用

这里先简单说明使用eureka进行业务层隔离,实现项目服务化也可以理解为微服务,我一直崇尚先实现代码再学习理论,先简单上手进行操作,eureka使用分为三块,1是服务注册中心,2是服务生产模块,3是服务消费模块

关系调用说明:

  • 服务生产者启动时,向服务注册中心注册自己提供的服务
  • 服务消费者启动时,在服务注册中心订阅自己所需要的服务
  • 注册中心返回服务提供者的地址信息给消费者
  • 消费者从提供者中调用服务

Eureka包含了Server端和Client端组件。

Server端是服务注册中心,用于提供服务的注册与发现。Eureka支持高可用的配置,当集群中有分片出现故障时,Eureka就会转入自动保护模式,它允许分片故障期间继续提供服务的发现和注册,当故障分片恢复正常时,集群中其他分片会把他们的状态再次同步回来。
Client端组件包含服务消费者与服务生产者。在应用程序运行时,Eureka服务生产者会向注册中心注册自身提供的服务并每30s发送心跳来更新它的服务租约,当一段时间生产者没有向服务中心续租将会被移出服务提供注册表。同时也可以从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态。

二、搭建eurkea服务注册中心

新建Project或者Module,选择Maven结构

简单看一下我的模块结构

1、修改pom.xml文件,增加springboot和springcloud的配置,由于使用的最新的spring boot所以spring cloud也是使用最新版本,注意这里的version是Finchley.RELEASE

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

2、新建resources文件夹并在File -> Project Structure 中设置为Resources格式,并增加application.yml格式文件,也可用properties格式

spring:
application:
#Eureka服务注册中心名称
name: javademo-tyh-eureka-server server:
#服务注册中心端口号
port: 11000 eureka:
instance:
#服务注册中心主机名
hostname: localhost client:
#是否向服务注册中心注册自己
register-with-eureka: false
#是否检索服务
fetch-registry: false
#服务注册中心的地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3、在main方法的类中增加@EnableEurekaServer注解来标明是服务注册中心,从main方法中写spring boot的运行代码

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer
@SpringBootApplication
public class AppEureka
{
public static void main( String[] args ) {
SpringApplication.run(AppEureka.class, args);
}
}

OK,现在eurkea的服务注册中心就配置完毕了,从main这里启动一下,浏览器中访问http://localhost:11000就能看到运行状态界面了,如果端口号冲突自己修改一下即可

现在可以在"Instances currently registered with Eureka"中看到没有任何服务注册进来。

三、搭建服务生产模块

新建Module,选择Maven的QuickStart模板当作服务生产者,先看我的目录结构,没有用的文件我都打了马赛克了

1、修改pom.xml文件,增加spring boot和spring cloud节点,注意在dependencies的cloud节点下增加了exclusions节点指明与注册中心的通信协议,否则可能无法注册服务

    <dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <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>
<!-- 设置与注册中心的通信协议,否则有可能提示错误“拒绝注册服务” -->
<exclusions>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-apache-client4</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

2、新建resources文件夹并在File -> Project Structure 中设置为Resources格式,并增加application.yml格式文件

#设置提供的服务名
spring:
application:
name: javademo-tyh-service-base
#服务注册中心地址(刚刚搭建的Eureka Server的地址)
eureka:
client:
service-url:
defaultZone: http://localhost:11000/eureka
#设置自己启动的端口
server:
port: 12000

3、在main方法的类中增加@EnableEurekaClient注解来标明是服务客户端,从main方法中写spring boot的运行代码

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient
@SpringBootApplication
public class AppServiceBase
{
public static void main( String[] args )
{
SpringApplication.run(AppServiceBase.class,args);
}
}

4、编写各自提供服务的Controller和Action,新建一个controller文件夹,建立UserController类,编写服务方法,重要的是增加一个private DiscoveryClient对象来自动注入服务方法,自己新建一个Model模块存储实体

import javademo.tyh.model.base.UserModelEx;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; @Controller
@RequestMapping("/user")
public class UserController { @Autowired
private DiscoveryClient client; @ResponseBody
@RequestMapping("/list")
public List<UserModelEx> list() {
UserModelEx modelEx = new UserModelEx();
modelEx.setId(100);
modelEx.setUsername("taiyonghai");
modelEx.setPassword("111111");
modelEx.setSex(1);
modelEx.setSexString("男");
modelEx.setAge(30);
modelEx.setCreateTime(LocalDateTime.now());
List<UserModelEx> list = new ArrayList<>();
list.add(modelEx);
return list;
} @ResponseBody
@RequestMapping("/get")
public UserModelEx get( int id ) {
System.out.println("接收参数:" + id);
UserModelEx modelEx = new UserModelEx();
modelEx.setId(id);
modelEx.setUsername("taiyonghai");
modelEx.setPassword("111111");
modelEx.setSex(1);
modelEx.setSexString("男");
modelEx.setAge(30);
return modelEx;
}
}

OK,现在一个服务生产者就搭建完毕,我们先启动eurkea服务注册中心http://localhost:11000,再启动服务生产者http://localhost:12000如果端口被占用自行更换

可以看到我们刚刚搭建的服务已经被注册进来了,下面直接访问刚刚提供服务的action看看响应结果http://localhost:12000/user/list,有数据生产者搭建完毕。

四、搭建服务消费模块

新建Module,选择Maven的QuickStart模板当作服务消费者,先看我的目录结构

1、修改pom.xml文件,增加spring boot和spring cloud节点,由于eureka很大程度上都跟spring boot有关系,所以基本每个端都需要配spring boot,消费者这边使用Ribbon进行客户端负载均衡

    <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- import spring cloud eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!-- import spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

2、新建resources文件夹并在File -> Project Structure 中设置为Resources格式,并增加application.yml格式文件

#设置自己的程序名称
spring:
application:
name: javademo-tyh-web-base
#thymeleaf 配置
thymeleaf:
encoding: UTF-8
prefix: classpath:/templates
cache: false
#服务注册中心地址(刚刚搭建的Eureka Server的地址)
eureka:
client:
#是否向服务中心注册自己
register-with-eureka: false
#设置eureka服务中心的地址
service-url:
defaultZone: http://localhost:11000/eureka
#设置自己启动的端口
server:
port: 13000

3、在main方法的类中增加@EnableDiscoveryClient注解来标明是服务客户端,从main方法中写spring boot的运行代码

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.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; @SpringBootApplication
@EnableDiscoveryClient
@EnableAutoConfiguration
public class AppWebBase
{
public static void main( String[] args )
{
SpringApplication.run(AppWebBase.class, args);
} @Bean
@LoadBalanced //客户端负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

4、编写消费者的Controller和Action,新建一个controller文件夹,建立UserController类,编写服务方法,重要的是增加一个private RestTemplate对象来调用服务生产者

import javademo.tyh.model.base.UserModelEx;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import java.util.List; @RequestMapping("/user")
@Controller
public class UserController { //自动获取RestTemplate
@Autowired
private RestTemplate restTemplate; @RequestMapping("/list")
public String list( Model model ) { //泛型集合先指定内部对象类型
ParameterizedTypeReference<List<UserModelEx>> paramType = new ParameterizedTypeReference<List<UserModelEx>>() {};
//由于没有请求参数,所以直接RestTemplate.exchange()调取接口,使用ResponseEntity获取响应对象
//第一个参数是服务名称及服务地址
ResponseEntity<List<UserModelEx>> responseEntity = restTemplate.exchange("http://javademo-tyh-service-base/user/list", HttpMethod.POST, null, paramType);
//ResponseEntity指明了泛型数据,所以直接调用getBody()方法会自动序列化为此对象
List<UserModelEx> list = responseEntity.getBody(); model.addAttribute("models", list);
return "/user/list";
} @RequestMapping("/get")
public String get(Model model) { //服务接口请求参数对象,并填充参数
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("id", "555");
//声明请求实体HttpEntity,并填入请求参数
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, null);
//由于返回对象不是泛型,所以也不需要先获取内部类型,直接调用并传递请求对象
//第一个参数是服务名称及服务地址
ResponseEntity<UserModelEx> responseEntity = restTemplate.exchange("http://javademo-tyh-service-base/user/get", HttpMethod.POST, requestEntity, UserModelEx.class);
//自动序列化返回对象
UserModelEx modelEx = responseEntity.getBody(); model.addAttribute("modelEx", modelEx);
return "/user/get";
}
}

5、建立对应action的页面,并把获取到的内容渲染到页面中,在resources下建立templates/user文件夹,创建list页面填入以下内容

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>this is /user/list</h1>
<table border="1px">
<tr th:each="item : ${models}">
<td th:text="${item.Id}">id</td>
<td th:text="${item.Username}">username</td>
<td th:text="${item.Password}">password</td>
<td th:text="${item.Sex}">sex</td>
<td th:text="${item.Age}">age</td>
<td th:text="${item.CreateTime}">createtime</td>
</tr>
</table>
</body>
</html>

OK,现在一个服务消费者就搭建完毕,可以运行打开浏览器http://localhost:13000/user/list来查看是否调用成功

到此整个Eurkea的服务注册中心、服务生产者、服务消费者都搭建完毕,后面再根据文档查看详细的高可用配置等,加深一下对该技术的了解。

IDEA项目搭建六——使用Eureka和Ribbon进行项目服务化的更多相关文章

  1. 架构师入门:搭建基本的Eureka架构(从项目里抽取)

    没有废话,直接上干货,理论部分大家可以看其它资料. 这里是部分关键代码,如果需要全部可运行的代码,请给本人留言. 在后继,还将给出搭建高可用Eureka架构的方式. 1 Eureka的框架图 在Eur ...

  2. IDEA项目搭建一——使用Maven创建多模块项目

    废话不多说,直接开始吧,如果有哪里写的不多的,还望指出,谢谢 一.创建空项目EmpayProject File -> New -> Project 二.添加父模块Parent Module ...

  3. vue项目搭建及创建、目录结构、项目启动、全局配置

    Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...

  4. Java web项目搭建系列之二 Jetty下运行项目

    在项目pom.xml文件中添加Jetty运行配置 在pom.xml文件project节点下插入如下代码: <build> <plugins> <plugin> &l ...

  5. Java web项目搭建系列之一 Eclipse中新建Maven项目

    前提条件: 已经安装好JDK 已经安装好Maven 已经安装好Eclipse 已经安装好Maven插件 在Eclipse中新建Maven项目 [File]→[New]→[Other...] [Mave ...

  6. 架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)

    本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的. 在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进.大家可以想象下,在上文里案 ...

  7. 从壹开始 [ Nuxt.js ] 之二 || 项目搭建 与 接口API

    前言 哈喽大家周一好,今天的内容比较多,主要就是包括:把前端页面的展示页给搭出来,然后调通接口API,可以添加数据,这两天我也一直在开发,本来想一篇一篇的写,发现可能会比较简单,就索性把项目搭建的过程 ...

  8. 搭建VUE项目的准备(利用vue-cli来构建项目)

    首先需要明确的是:Vue.js 不支持 IE8 及其以下 IE 版本,一般用与移动端,基础:开启最高权限的DOS命令(否则会出现意外的错误提示)   注意:个人小推荐如果我们不知道如何才能开启最高权限 ...

  9. vue项目搭建 (二) axios 封装篇

    vue项目搭建 (二) axios 封装篇 项目布局 vue-cli构建初始项目后,在src中进行增删修改 // 此处是模仿github上 bailicangdu 的 ├── src | ├── ap ...

随机推荐

  1. Kubernetes-2--安装部署

    kubernetes的部署方式: 1,kubeadm 2, 二进制安装包部署 条件准备: 1,关闭系统的swap分区 为什么要关闭swap分区,我还没有去看官方的说明,搜索到的答案是 kubernet ...

  2. API接口设计:防参数篡改+防二次请求

    API接口由于需要供第三方服务调用,所以必须暴露到外网,并提供了具体请求地址和请求参数 为了防止被第别有用心之人获取到真实请求参数后再次发起请求获取信息,需要采取很多安全机制 1.首先: 需要采用ht ...

  3. python中两种栈实现方式的性能对比

    在计算机的世界中,同一个问题,使用不同的数据结构和算法实现,所使用的资源有很大差别 为了方便量化python中算法的资源消耗,对性能做测试非常有必要,这里针对stack做了python语言 下的性能分 ...

  4. 修改idea打开新窗口的默认配置

    使用idea开发maven项目时,发现使用新窗口创建一个项目时,例如file-settings的maven库配置都是用的用户下的maven库,如何配置一个全局的maven配置呢,操作如下: File- ...

  5. Python模块学习 - Paramiko

    简介 ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography). 有了Paramiko以后,我们就可以在Py ...

  6. [原创]Struts2奇葩环境任意文件上传工具(解决菜刀无法传文件或上传乱码等问题)

    上面这问题问得好  1 不知道大家有没碰到有些Strus2站点  上传JSP后访问404 或者503    注意我说的是404或503不是403(要是403换个css/img等目录或许可以)    但 ...

  7. textarea 赋值的方法

    textarea 赋值的方法 <textarea name="" rows="3" id="note21" ></text ...

  8. 正则表达式matcher.group用法

    group是针对括号()来说的,group(0)就是指的整个串,group(1) 指的是第一个括号里的东西,group(2)指的第二个括号里的东西. 上代码: @Test public void te ...

  9. OpenGL10-骨骼动画原理篇(1)

    视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 本例程展示如何建立骨骼动画,有些人叫蒙皮动画 定义如下: 当前 ...

  10. salesforce lightning零基础学习(九) Aura Js 浅谈二: Event篇

    上一篇介绍了Aura Framework中 Component类的部分方法,本篇将要介绍Event常用的方法. 1. setParam (String key , Object value):设置事件 ...