SpringCloud微服务搭建过程记录

本文详细介绍了如何在Java中使用Eureka作为服务注册中心,配置SpringCloud的Ribbon实现负载均衡,以及Zuul作为API网关。通过实例展示了如何在微服务架构中部署和调用服务,同时提供了面试题解析文档链接。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

首先在EurekaServer中加入注解@EnableEurekaServer 启用这个功能

然后修改application配置文件

由于每个eureka serve项目均为client,而当下要建立的是一个纯eureka serve服务,

所以增加fetch-registry: false register-with-eureka: false两项配置来告诉系统该服务并非是client无需将其注册到服务中心。

8761为注册中心的默认端口,这里修改为7071

做完上面配置,可以登录localhost:7071【服务注册中心】的管理界面查看

此时注册中心没有显示任何注册的服务,下面我们将创建服务并服务注册进去》

首先,建立一个拥有WEB、Eureka Discovery依赖的两个基础功能的项目

创建过程同上,区别只是依赖不同:

创建好之后入下图:

                                                                                                              

然后在两个服务项目的启动类都 A_Application B2_Application 增加@EnableEurekaClient注解 开启功能

继续修改配置文件 修改内容为

注意:service-A   service-B2两个微服务搭建的端口不同

建立Controller 编写测试业务逻辑(service-A   service-B2 )

service-A:

package com.dk.web;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.discovery.DiscoveryClient;

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;

import org.springframework.web.client.RestTemplate;

@RestController

public class ComputeController {

private final Logger logger = Logger.getLogger(getClass());

@Autowired

private DiscoveryClient client;

@RequestMapping(value = “/add” ,method = RequestMethod.GET)

public String add(@RequestParam Integer a, @RequestParam Integer b) {

ServiceInstance instance = client.getLocalServiceInstance();

Integer r = a + b;

logger.info(“/add, host:” + instance.getHost() + “, service_id:” + instance.getServiceId() + “, result:” + r);

return “From Service-A, Result is " + r+”\nPort:"+instance.getPort();

}

//call service-B

@RequestMapping(value=“testServiceB”,method=RequestMethod.GET)

public String testServiceB(@RequestParam Integer a,@RequestParam Integer b){

RestTemplate restTemplate=new RestTemplate();

return restTemplate.getForObject(“http://localhost:7078/add?a=”+a+“&b=”+b, String.class);

}

}

service-B2

package com.dk.web;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.discovery.DiscoveryClient;

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;

import org.springframework.web.client.RestTemplate;

@RestController

public class ComputeController {

private final Logger logger = Logger.getLogger(getClass());

@Autowired

private DiscoveryClient client;

@RequestMapping(value = “/sub” ,method = RequestMethod.GET)

public String sub(@RequestParam Integer a, @RequestParam Integer b) {

ServiceInstance instance = client.getLocalServiceInstance();

Integer r = a - b;

logger.info(“/sub, host:” + instance.getHost() + “, service_id:” + instance.getServiceId() + “, result:” + r);

return “From Service-B, Result is " + r+” \nPort:"+instance.getPort();

}

//call service-A

@RequestMapping(value=“testServiceA”,method=RequestMethod.GET)

public String testServiceB(@RequestParam Integer a,@RequestParam Integer b){

RestTemplate restTemplate=new RestTemplate();

return restTemplate.getForObject(“http://localhost:2222/add?a=”+a+“&b=”+b, String.class);

}

}

启动两个微服务项目项目————————————————————————————》

访问http://localhost:7071/查看服务中心

部署微服务service-A(由于没有涉及到项目,所以简单实现参数相加)

部署微服务service-B(简单实现参数相减)

  • 如果部署成功访问service-A 的 url: http://localhost:2222/add?a=111&b=113

  • 如果部署成功访问service-B2的 url: http://localhost:7078/sub?a=111&b=113

![](https://img-blog.csdnimg.cn/20190425121316490.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyX0JveV8=,size_16,color_FFFFFF,t_70)

  • 微服务B2调用微服务A的 url: http://localhost:7078/testServiceA?a=111&b=113

由上面两个url可以看出端口号都是service-B的。


部署zuul(Zuul相当于是Web网站后端所有请求的前门,详细的实现可以看code)

创建模块同上面创建一般springboot工程一样,只是依赖不同:

创建后目录结构:

启动类上打上@EnableZuulProxy注解

修改配置文件如下所示:

编写zuul请求过滤规则:

package com.dk.filter;

import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;

public class AccessFilter extends ZuulFilter {

private static Logger log = LoggerFactory.getLogger(AccessFilter.class);

//四种类型:pre,routing,error,post

//pre:主要用在路由映射的阶段是寻找路由映射表的

//routing:具体的路由转发过滤器是在routing路由器,具体的请求转发的时候会调用

//error:一旦前面的过滤器出错了,会调用error过滤器。

//post:当routing,error运行完后才会调用该过滤器,是在最后阶段的

@Override

public String filterType() {

return “pre”;

}

//自定义过滤器执行的顺序,数值越大越靠后执行,越小就越先执行

@Override

public int filterOrder() {

return 0;

}

//控制过滤器生效不生效,可以在里面写一串逻辑来控制

@Override

public boolean shouldFilter() {

return false;

}

//执行过滤逻辑 (这里就输出日志了,具体看你的业务了)

@Override

public Object run() {

RequestContext ctx = RequestContext.getCurrentContext();

HttpServletRequest request = ctx.getRequest();

log.info(String.format(“%s request to %s”, request.getMethod(), request.getRequestURL().toString()));

Object accessToken = request.getParameter(“accessToken”);

log.info(accessToken.toString());

// if(accessToken == null) {

// log.warn(“access token is empty”);

// ctx.setSendZuulResponse(false);

// ctx.setResponseStatusCode(401);

// return null;

// }

log.info(“access token ok”);

return null;

}

}

接着 我们启动下zuul工程,当然前面的工程都一直在运行着的,不能关闭了!!!

  • zuul的端口号是:7073

通过zuul访问服务A的 url: http://localhost:7073/api-a/add?a=111&b=113

  • 通过zuul访问服务B的url: http://localhost:7073/api-b/sub?a=111&b=113

我们发现都可以正常访问啦!!!!!!!!

这样所有的注册过的服务都可以在一个请求服务器上去访问了


部署ribbon(负载均衡)

负载均衡介绍:

简单来说负载均衡就是将用户的请求ping平摊的分配到多个任务上,从而是系统达到HA(高可用)。

目前主要分两种负载均衡:

1. 集中式LB:偏硬件,服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5。也可以是软件,如Nginx),由该设施负责把访问请求以某种策略转发至服务的提供方。

2. 进程内LB:偏软件, 将LB逻辑集成到消费方,消费方从服务注册中心指导哪些地址可用,再自己选择一个合适的服务器(如Ribbon)。

继续创建ribbon 模块 和之前一样的创建方式创建springboot工程,只是依赖不同:

创建后的项目结构如下:

在启动类添加必要注解  @EnableDiscoveryClient  ,注入必要的Bean

首先使用了RestTemplate并且开启了客户端负载均衡功能,开启负载均衡很简单,只需要在RestTemplate的bean上再添加一个@LoadBalanced注解即可

/Ribbon负载均衡策略/

@Bean

public IRule ribbonRule() {

return new RandomRule();

}

配置文件修改指定是对那个服务处理 和对应的均衡策略

在这个案例中只是对服务B进行负载均衡

  • 在部署ribbon之前,先创建service-B3模块 (创建过程略),步骤跟service-B2是一样的。主要是使得服务B生成两个实例,即service-B有两个不同的端口号。可以在eureka-server注册中心界面上看到效果。

最后

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

image

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

image

互联网Java程序员面试必备问题解析及文档学习笔记

image

Java架构进阶视频解析合集
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
创建service-B3模块 (创建过程略),步骤跟service-B2是一样的**。主要是使得服务B生成两个实例,即service-B有两个不同的端口号。可以在eureka-server注册中心界面上看到效果。

最后

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

[外链图片转存中…(img-Lxy5ayrp-1714761262457)]

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

[外链图片转存中…(img-9I3M5rOo-1714761262458)]

互联网Java程序员面试必备问题解析及文档学习笔记

[外链图片转存中…(img-ry8FBwh0-1714761262458)]

Java架构进阶视频解析合集
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值