软件 版本
IDEA 2022.3.1 <兼容maven 3.8.1及之前的所用版本>
JDK 1.8_64
Maven 3.8.2
本demo只使用了服务发现与注册、Feign调用及负载均衡。不涉及熔断与网关等模块。demo可通过百度云盘下载:链接:https://pan.baidu.com/s/1kfrBffhhQJhkpsJ8rbeQ7Q
提取码:yics

新建工程

新建eureka服务发现与注册模块

EurekaServer注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号

新建一个模块,选择Eureka Server依赖







pom.xml配置如下:

`



4.0.0



org.springframework.boot

spring-boot-starter-parent

2.7.8





com.vinphy

eureka-service

0.0.1-SNAPSHOT

eureka-service

eureka-service



<java.version>1.8</java.version>

<spring-cloud.version>2021.0.5</spring-cloud.version>







org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

    <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>

`
application.yml配置如下:
`server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka`
启动类添加@EnableEurekaServer注解
![](https://img2023.cnblogs.com/blog/775846/202302/775846-20230214160530784-1236719061.png)
启动eureka服务
![](https://img2023.cnblogs.com/blog/775846/202302/775846-20230214160647971-997301591.png)
访问 http://localhost:8761/ 网址,可看到Eureka页面,暂无Application
![](https://img2023.cnblogs.com/blog/775846/202302/775846-20230214160918727-1176070306.png)

新建一个服务提供者

将这个服务的信息注册到EurekaServer中,别的服务可以在不知道IP和端口的情况下调用该服务。

新建一个模块,引入Eureka Discovery Client 依赖



pom.xml配置文件如下:

`



4.0.0



org.springframework.boot

spring-boot-starter-parent

2.7.8





com.vinphy

eureka-client

0.0.1-SNAPSHOT

eureka-client

eureka-client



<java.version>1.8</java.version>

<spring-cloud.version>2021.0.5</spring-cloud.version>







org.springframework.cloud

spring-cloud-starter-netflix-eureka-client





org.springframework.boot

spring-boot-starter-web

    <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>

`
该服务可部署多个,建立一个公共配置文件,然后在子配置文件中配置不同端口,如本示例中8762、8763两个端口。
application.yml配置文件如下:
`spring:
application:
name: service-support
profiles:
active: server1`
application-server1.yml配置文件如下:
`server:
port: 8762
eureka:
instance:
hostname: server1
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/`
application-server2.yml配置文件如下:
`server:
port: 8763
eureka:
instance:
hostname: server2
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
`
启动类加上@EnableEurekaClient注解
`package com.vinphy.eurekaclient;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication

@EnableEurekaClient

public class EurekaClientApplication {

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

}

新建一个TestController类,定义/support方法package com.vinphy.eurekaclient;

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

import org.springframework.stereotype.Controller;

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 TestController {

@Value("${server.port}")
String port; @RequestMapping(value = "/support",method = RequestMethod.GET)
public String home(@RequestParam String name)
{
return "hi " + name + ",i am from port:" + port;
}

}

`

启动服务,可以在Eureka网站上看到SERVICE-SUPPORT服务端口为8762



访问网址 http://localhost:8762/support?name=nwh 可得到support方法打印内容

再启动一次service-support服务

修改application.yml配置文件中active配置为server2

spring: application: name: service-support profiles: active: server2

添加一个启动配置,并启动





访问Eureka网页,可以看到service-support启了两个实例,端口分别为8762、8763

新建feign动态代理

Feign使用了动态代理,用注解定义一个FeignClient接口,然后调用这个接口就可以了。FeignClient会在底层根据注解,与指定的服务建立连接、构建请求地址、发起请求、获取响应、解析响应等等。

新建一个模块,引入OpenFeign依赖



pom.xml配置文件如下:

`



4.0.0



org.springframework.boot

spring-boot-starter-parent

2.7.8





com.vinphy

serice-feign

0.0.1-SNAPSHOT

serice-feign

serice-feign



<java.version>1.8</java.version>

<spring-cloud.version>2021.0.5</spring-cloud.version>







org.springframework.boot

spring-boot-starter-web





org.springframework.cloud

spring-cloud-starter-netflix-eureka-client





org.springframework.cloud

spring-cloud-starter-openfeign

    <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>

`
application.yml配置文件如下:
`server:
port: 8765
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: service-feign`
启动类加上@EnableDiscoveryClient、@EnableFeignClients注解
`package com.vinphy.sericefeign;

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 SericeFeignApplication {

    public static void main(String[] args) {

    SpringApplication.run(SericeFeignApplication.class, args);

    }

}

定义一个HiController类,和hi方法package com.vinphy.sericefeign;

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

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 HiController {

@Autowired

SchedualServiceHi schedualServiceHi;

@RequestMapping(value = "/hi",method = RequestMethod.GET)
public String sayHi(@RequestParam String name){
return schedualServiceHi.sayHiFromClientOne(name);
}

}

定义一个SchedualServiceHi接口,通过@FeignClient注解绑定service-support服务。package com.vinphy.sericefeign;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

/**绑定service-support服务,调用该服务的support方法*/

@FeignClient(value = "service-support")

public interface SchedualServiceHi {

@RequestMapping(value = "/support", method = RequestMethod.GET)

String sayHiFromClientOne(@RequestParam(value = "name") String name);

}

`

启动服务,此时可以通过访问8765端口实际调用service-support服务的support方法,因为service-support服务有两个端口,不断访问 http://localhost:8765/hi?name=vinphy ,会交替打印862、8763端口



新建Ribbon负载均衡服务

Ribbon会帮你在每次请求时选择一台机器均匀的把你的请求分发到各个机器上

新建service-ribbon模块

eureka包含了ribbon,所以不需要单独引入ribbon依赖

pom.xml配置文件如下:

`



4.0.0



org.springframework.boot

spring-boot-starter-parent

2.7.8





com.vinphy

service-ribbon

0.0.1-SNAPSHOT

service-ribbon

service-ribbon



<java.version>1.8</java.version>

<spring-cloud.version>2021.0.5</spring-cloud.version>







org.springframework.boot

spring-boot-starter-web





org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

    <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.1.0.RELEASE</version>
</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>

`
application.xml配置文件如下:
`server:
port: 8764
spring:
application:
name: service-ribbon
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/`
启动类加入@EnableDiscoveryClient、@EnableHystrix注解。并添加restTemplate方法
`package com.vinphy.serviceribbon;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

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

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.cloud.netflix.hystrix.EnableHystrix;

import org.springframework.context.annotation.Bean;

import org.springframework.web.client.RestTemplate;

/**

  • 负载均衡

    */

    @SpringBootApplication

    @EnableDiscoveryClient

    @EnableHystrix

    public class ServiceRibbonApplication {

    public static void main(String[] args) {

    SpringApplication.run(ServiceRibbonApplication.class, args);

    }

    @Bean

    @LoadBalanced

    RestTemplate restTemplate()

    {

    return new RestTemplate();

    }

}

新建HelloControler类,定义hi方法package com.vinphy.serviceribbon;

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

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 HelloControler {

@Autowired

HelloService helloService;

@RequestMapping(value = "/hi",method = RequestMethod.GET)

public String hi(@RequestParam String name)

{

return helloService.hiService(name);

}

}

新建HelloService类,自动注入restTemplate。通过restTemplate的getForObject方法去用http方式访问其他服务。不需要知道被访问服务的IP和端口,只需要知道被访问服务的注册服务名。package com.vinphy.serviceribbon;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

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

import org.springframework.stereotype.Service;

import org.springframework.web.client.RestTemplate;

@Service

public class HelloService {

@Autowired

RestTemplate restTemplate;

@HystrixCommand(fallbackMethod = "hiError")

public String hiService(String name)

{

return restTemplate.getForObject("http://service-support/"+"support?name=" + name, String.class);

}

public String hiError(String name) {
return "hi," + name + ",sorry,error!";
}

}

`

启动服务,访问网址 http://localhost:8765/hi?name=vinphy ,会在876、8763两个不同服务间交替调用。



springcloud微服务搭建demo的更多相关文章

  1. 十一、Docker搭建部署SpringCloud微服务项目Demo

    环境介绍 技术选型:SpringCloud&SpringCloud Alibaba&Docker 微服务模块划分: 员工模块:ems-employees 部门模块:ems-depart ...

  2. springcloud微服务架构搭建

    SpringCloud微服务框架搭建 一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么是集群 多台服务器部署相同应用构成一个集群 作用:通 ...

  3. 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)

    微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...

  4. SpringCloud微服务(基于Eureka+Feign+Hystrix+Zuul)

    一.搭建注册中心 1.1.创建一个cloud-service项目 1.2:POM文件依赖 1 <?xml version="1.0" encoding="UTF-8 ...

  5. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  6. 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul

    通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...

  7. java~springcloud微服务目录索引

    回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springcloud微服务~目录索引 springcloud~服务注 ...

  8. SpringCloud微服务负载均衡与网关

    1.使用ribbon实现负载均衡ribbon是一个负载均衡客户端 类似nginx反向代理,可以很好的控制htt和tcp的一些行为.Feign默认集成了ribbon. 启动两个会员服务工程,端口号分别为 ...

  9. SpringCloud微服务之跨服务调用后端接口

    SpringCloud微服务系列博客: SpringCloud微服务之快速搭建EurekaServer:https://blog.csdn.net/egg1996911/article/details ...

  10. springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

    相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...

随机推荐

  1. win10+vs2019 编译webrtc m108

    不能访问外网途径的捷径 已经下载好的资源,可以直接生成工程: https://pan.baidu.com/s/14plvXZD_qX9nn441RbsCwA?pwd=ww8c 该资源可以跳过的步骤 步 ...

  2. mingw编译opencv动态链接库和静态链接库及使用方法

    前言 我一直不知道编译的过程以及cmake, make 这些工具是干什么的,所有抽时间研究了一下. 简单来说就是 cmake 是根据 CMakeLists.txt 用来生成 makefile文件的.而 ...

  3. Windows及eclipse常用快捷键-小彤在努力

    Windows快捷键 Ctrl+A:全选 Ctrl+S:保存 Ctrl+Z:撤回 Ctrl+X:剪切 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+F:查找 Windows+E:打开我的电脑 Al ...

  4. 写一个flutter程序

    这一部分我们写一个简单应用 功能是,为一个创业公司生成建议的公司名称. 用户可以选择和取消选择的名称,保存喜欢的名称. 该代码一次生成十个名称 用户滚动时,生成新一批名称. 着重体验以下几点 Flut ...

  5. 【每日一题】【树的dfs递归,返回多次,注意都遍历完后才最终返回】2022年1月6日-112. 路径总和

    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum .判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 tr ...

  6. SQL语句查询关键字 多表查询

    目录 SQL语句查询关键字 select from 编写顺序和查询数据 前期数据准备 编写SQL语句的小技巧 查询关键字之筛选 where 逻辑运算符 not and or between not b ...

  7. 强化学习调参技巧二:DDPG、TD3、SAC算法为例:

    1.训练环境如何正确编写 强化学习里的 env.reset() env.step() 就是训练环境.其编写流程如下: 1.1 初始阶段: 先写一个简化版的训练环境.把任务难度降到最低,确保一定能正常训 ...

  8. AcWing1137. 选择最佳线路

    题目传送门 题目大意 \(\qquad\)有一张有向图,可以有若干个起点,只有一个终点,求所有起点到终点的最短路中最短的一条,若所有起点都与终点不连通,则输出\(-1\) 解题思路 \(\qquad\ ...

  9. apt install protobuf

    protobuf介绍:https://www.cnblogs.com/niuben/p/14212711.html protobuf利用源码编译安装已经看到过很多方法,这里总结下用apt安装的方法. ...

  10. C++可执行文件绝对路径获取与屏蔽VS安全检查

    :前言 前几天写新项目需要用到程序所在绝对路径的时候,发现网上居然一点相关分享都没有. :_pgmptr 翻箱倒柜找出了几本教程,发现了一个叫_pgmptr的东西. 进去看了一下,在stdlib.h里 ...