从 0 搭建 Spring Cloud 服务,超完整教程来了!
Java后端编程
共 15310字,需浏览 31分钟
· 2021-07-15
作者:Anakki
来源:blog.csdn.net/qq_29519041/article/details/85238270
一、微服务基础
1.什么是 SpringCloud?
二、微服务的搭建
2.1 工程初始化配置
![](https://filescdn.proginn.com/051846e8d272352691c4dc6d11d73335/62df897e88fcdc9affcf92da87d072d0.webp)
![](https://filescdn.proginn.com/7f15a3b26ff4a52715be1430afbe333e/b8c2b016bd0875aa8ffe0c326ed1bb5e.webp)
![](https://filescdn.proginn.com/07763994c7e04bf9cb789a04951eb0ed/dfeacbce9808e648ad3537655ec0113e.webp)
![](https://filescdn.proginn.com/792402e5a0d19fd9151d75160497c4e1/581667df343043b6ffa999c27ec90301.webp)
![](https://filescdn.proginn.com/d052b8b2ec760a3a97a147255ee51ed2/0888a2094fec35f7f01691890fa6fe45.webp)
![](https://filescdn.proginn.com/bb9acc6f160d8f17bad2f96f9b81d6cf/f9c0f8b3ab768581fbb132dde58bcc3c.webp)
![](https://filescdn.proginn.com/ce84580e3bb3da50f94e0f09d03e2180/ef2f957fffa0fd0b744ba87582ba2912.webp)
![](https://filescdn.proginn.com/ce2a1cea83ddd2342226bdaf399e47a7/e585f0f81aac696663aef32f70a71ec9.webp)
![](https://filescdn.proginn.com/1b54e42c0fbb91fa9d82a6e91564bee7/63f98dbee6b6f1ba1efc8bda7702e17a.webp)
![](https://filescdn.proginn.com/10e49eba34af43a0fc66ad173c9cf0e5/164d08f91ec8fef4feb071added351fd.webp)
![](https://filescdn.proginn.com/91d59b3b114ce90b37363c776d019dc2/cd9ee1e67f87dbec914463745ec652f0.webp)
<?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>
<groupId>com.yun</groupId>
<artifactId>springcloud-eureka-server</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springcloud-eureka-server</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--引入springboot-parent父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<dependencies>
<!--引入springcloud的euekea server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--指定下载源和使用springcloud的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
![](https://filescdn.proginn.com/e1f7d7f8ece932f668b196df4e7a9fed/42e2c0cdb4489697b2d74043975bab49.webp)
![](https://filescdn.proginn.com/f2af5a9195cb4942f3c0910a2d39ed03/da98b86212019a0b95c42dc3cc9d1422.webp)
2.2 Springboot的搭建 以及提供注册服务 的 服务配置
![](https://filescdn.proginn.com/71f7e0a31110a2feaf8742d50cfbf691/01bc1cdee05e675347eb1d04947ec3db.webp)
![](https://filescdn.proginn.com/e578241ed56cd85c6996d6562cb30a78/2115bddf230d6c7b5d9745e4573f3f38.webp)
![](https://filescdn.proginn.com/b5758fd19f95635745cc108033ccd4bb/84476e23e238a841316319dac1e9b0fb.webp)
![](https://filescdn.proginn.com/3718eeed9b895ec4064d6123dabc2da9/3f8972e1533c6c54db388f3c7c397afd.webp)
server:
port: 8700 # 端口自己决定
# 指定当前eureka客户端的注册地址,也就是eureka服务的提供方,当前配置的服务的注册服务方
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
register-with-eureka: false #自身 不在向eureka注册
fetch-registry: false #启动时禁用client的注册
instance:
hostname: localhost
#指定应用名称
spring:
application:
name: eureka-server
![](https://filescdn.proginn.com/28e89b1b3d39ce88bc613d96834679ce/5b5c948047869025a1013b4c0ebc5cfc.webp)
![](https://filescdn.proginn.com/85ee7df2ea28dc157e7e6c93c615e5df/92d6b807d5b8c82f3d27abb6ba2a8aad.webp)
package com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //当前使用eureka的server
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
![](https://filescdn.proginn.com/4fe45159506d6cad805d067746534d1b/7c7f140f24c059de3d8c0d85c27c6955.webp)
![](https://filescdn.proginn.com/c5caf0cebfa395ed163cd0f1263c9899/8c552d66617220070398accdac2937c0.webp)
![](https://filescdn.proginn.com/2b5b95e8db27b64cf6c7a55fadbb109c/3cf22a94459e5b4df2de5d68125846c0.webp)
2.3 客户端client 提供真正服务的角色的配置, 它提供服务 在 服务注册方server (注册中心)进行注册
![](https://filescdn.proginn.com/2edd4095d52754abcc293d120128186c/c264479c2d9e7f7759e5e955ef0d9b7a.webp)
![](https://filescdn.proginn.com/2ca9ab2cf64af69d5e0d49c3be04f50e/966dd1c6d4b3ff02d15734f955c7d66d.webp)
![](https://filescdn.proginn.com/e93b6991234113bc91b99a9554cd8926/4438de015f82d59623edf3038a7e00f3.webp)
![](https://filescdn.proginn.com/885fdb75160416360cd8da5206e848f3/15b2d15e4837b01190ad94c074687b22.webp)
![](https://filescdn.proginn.com/f250a772131fa7b8a244b9ee4699da32/8235c1ac51121ab099f751a1433a6140.webp)
![](https://filescdn.proginn.com/df918da85b935feb75d8b91be5008ff2/3fc4935ae872f6d27e3fb92974bc70bb.webp)
server:
port: 8701 # 服务提供方
# 指定当前eureka客户端的注册地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#当前服务名称
spring:
application:
name: eureka-service
![](https://filescdn.proginn.com/16f305f3b4573993db6bf059f4fe0e32/589b80f33a778c30bf82c00dc1a90da0.webp)
package com.yun;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/Hello")
public class Controller {
@RequestMapping("/World")
public String helloWorld(String s){
System.out.println("传入的值为:"+s);
return "传入的值为:"+s;
}
}
package com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient//代表自己是一个服务提供方
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class,args);
}
}
![](https://filescdn.proginn.com/aaca5ac1cceccf681b0a4ed2a261eb6d/af8a96234c70c7874a2a7f8ed9e99144.webp)
![](https://filescdn.proginn.com/a587e38fb99d9ec5f94c4384822f909a/a5f67cc452f25aa0a497b661ce4d0289.webp)
![](https://filescdn.proginn.com/8f6a3d2c718fb0557719feec5d262db5/c54eb47c3c9377f9785109b857e8e631.webp)
2.4 服务的调用方式
第一种调用方式:restTemplate+ribbon
第二种调用方式:feign
![](https://filescdn.proginn.com/25bd3e6c299ee5451ed567a1eef1445d/c7329e4c6b824fd819d660eddde00ab8.webp)
2.4.1 restTemplate+ribbon
而客户端负载均衡和服务端负载均衡最大的不同点在于上面所提到服务清单所存储的位置。在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端端清单来自于服务注册中心,比如上一章我们介绍的Eureka服务端。同服务端负载均衡的架构类似,在客户端负载均衡中也需要心跳去维护服务端清单的健康性,默认会创建针对各个服务治理框架的Ribbon自动化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。在实际使用的时候,我们可以通过查看这两个类的实现,以找到它们的配置详情来帮助我们更好地使用它。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
server:
port: 8702 # 服务消费方
# 指定当前eureka客户端的注册地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#当前服务名称
spring:
application:
name: eureka-consumer
package com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //当前使用eureka的server
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class,args);
}
}
![](https://filescdn.proginn.com/f6cb270c62f306110bc62cb06e5ae0a4/ca25f2d848b7bd199a05a8bfe03b488f.webp)
package com.yun.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/Hello")
class ConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/Consumer")
public String helloWorld(String s){
System.out.println("传入的值为:"+s);
//第一种调用方式
//String forObject = new RestTemplate().getForObject("http://localhost:8071/Hello/World?s=" + s, String.class);
//第二种调用方式
//根据服务名 获取服务列表 根据算法选取某个服务 并访问某个服务的网络位置。
//ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
//String forObject = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/Hello/World?s="+s,String.class);
//第三种调用方式 需要restTemplate注入的方式
String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
return forObject;
}
}
@Autowired private LoadBalancerClient loadBalancerClient;
package com.yun.beans;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class Beans {
//管理简单对象
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
访问服务消费方@RequestMapping指定的路径及消费方的端口来访问消费方的controller controller根据服务名去server方获取获取服务列表,获取服务列表后根据随机的模式负载匀衡后去选择服务地址去访问servicesupport:如下图
![](https://filescdn.proginn.com/dd81da4fdbc11cd85c26d1ae94492b92/147a7d87c4e5aebaa46482f4446bbe4d.webp)
2.5 Eureka server的高可用配置
![](https://filescdn.proginn.com/3fcda9a7a1addd1852f40791ff75430a/9cfad62d35f36b85ff675fdf99d62685.webp)
![](https://filescdn.proginn.com/925fc9d70a08e3f18d8acdd3ef342fbb/6f338b80628724ab7ea3d523d22ff884.webp)
![](https://filescdn.proginn.com/2fc8820088682f1e480fb615126cded6/3f069699beb86cd506572e1dc9847f0b.webp)
![](https://filescdn.proginn.com/dc69252b2f240ae970d0a33327045eb3/3d4dfbcc24bef383f274df4bd098d491.webp)
![](https://filescdn.proginn.com/70240d93a6538ea26b1c6ae9355d3489/e3bd0c80e9db7e4ecc39da79822f2734.webp)
![](https://filescdn.proginn.com/5a9e046289bf02b3ad46e8e0926894db/a5dc5ec34803397c1f7c8a9cbb99177a.webp)
![](https://filescdn.proginn.com/f8afdce0d8f21b6598a0f59df330a747/7bd78086fc7ccfde91ed0645f4c34db9.webp)
![](https://filescdn.proginn.com/cf4884beaa4484b9536ccabf2dda04da/4bbe9ef8e703949e79709d4c2e4b8576.webp)
![](https://filescdn.proginn.com/02e075f0328d298406f4f248196dd52d/177799a656361aeceff35f0c6166df7e.webp)
![](https://filescdn.proginn.com/7a539ed2eb5477439e0d005efa80f6ed/f92a21152f88babdcaabaca2c9c429ba.webp)
![](https://filescdn.proginn.com/93a21a45c1e1ebfd70e9c9333d1a45c4/36cc89d11c1b86084d44e60991355add.webp)
![](https://filescdn.proginn.com/5ff2e98684efd00bfef200d7330e3a3c/92d93aafb32a0d6bd9455ce81f216b64.webp)
![](https://filescdn.proginn.com/346733dcc3bf949773611327b7cde7b4/6b234137393e7cd0d1ec92f2fd4a7137.webp)
![](https://filescdn.proginn.com/307f97ab5d1aae72bcaa84b7fd3419e9/0a463f5886100aebbf02d161e346ddbd.webp)
![](https://filescdn.proginn.com/6bea5d3213fa0e63c4e69779c888a6d2/04427ebb60e5203489c4fd93508619e9.webp)
![](https://filescdn.proginn.com/2f9a1f5b462155d601f823e73b978f03/7432d70cd67638a82cdfdebe56951319.webp)
![](https://filescdn.proginn.com/023a9246f8466662a17a79b7bb2a7ca8/21eb155a93fb008ee10cd51731a2b4d2.webp)
![](https://filescdn.proginn.com/cc9bca034a1686357f8967a57bc9abef/c15ccf4bc8b23f0e76e168799cbc71b7.webp)
![](https://filescdn.proginn.com/b320278cf5cb328f3edf76c9769e1aba/403f027e7ec5ab8e8b425ebc73365f58.webp)
![](https://filescdn.proginn.com/a27dcc86397bd8f49a59d3328fe6b665/b649352ccdbcd16ed9171f360688ce0b.webp)
![](https://filescdn.proginn.com/a27dcc86397bd8f49a59d3328fe6b665/b649352ccdbcd16ed9171f360688ce0b.webp)
![](https://filescdn.proginn.com/60dc56174b2835fba64bc5eb3457422a/e320c4a3e8d4ed8efbe3e30f96e87a0b.webp)
如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。 —————END————— 推荐阅读: 推荐一款神器,助你秒级定位线上问题! 代码中大量的if/else,你有什么优化方案? 你还在用Jenkins?赶快看看这些替代方案吧! 程序员常用的 15 款Java开发者工具 最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式:关注公众号并回复 java 领取,更多内容陆续奉上。 明天见(。・ω・。)ノ♡
评论