springboot多端口 8761端口怎么隐藏

springcloud入门系列(2)-Feign、Ribbon实现Rest接口请求和负载均衡 - 简书
springcloud入门系列(2)-Feign、Ribbon实现Rest接口请求和负载均衡
前面我们介绍了通过springcloud的eureka服务注册组件实现,并且实现了多机互备的HA,同时也将之前写的springboot的服务注册到了eureka上,今天我们主要来介绍下作为服务使用者如何去使用这些服务接口并且实现基于服务化的软负载均衡。对于之前实现的springboot的rest接口服务,一般来说进行restful接口的接收和拆组包,可以通过apache的httpclient、jdk的URLConnection、okhttp等http请求库,也可以通过spring提供的resttemplate,这里我们使用springcloud推荐的feign来进行报文解析来体会下它的优势,为什么spring会大力推荐一个新的rest请求组件,比传统的使用httpclient等有什么优势。
1. POM增加Feign和Ribbon相关依赖库
新建一个springboot工程,并添加cloud的依赖,本文中使用的是1.4.7版本,具体的代码可以参见文后的源码,这里需要在pom中添加对ribbon和feign的依赖。还需要加入对Zuul网关组件的依赖,如果没有网关组件,在启动的时候会报Hystrix的错误,“Caused by: java.lang.ClassNotFoundException: com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect。“
&dependency&
&groupId&org.springframework.cloud&/groupId&
&artifactId&spring-cloud-starter-zuul&/artifactId&
&/dependency&
&dependency&
&groupId&org.springframework.cloud&/groupId&
&artifactId&spring-cloud-starter-ribbon&/artifactId&
&/dependency&
&dependency&
&groupId&org.springframework.cloud&/groupId&
&artifactId&spring-cloud-starter-feign&/artifactId&
&/dependency&
2. Application启动类增加Feign依赖
在application类中需要增加在类名前面增加@EnableFeignClients的注解,这个注解的意思就是在该应用被启动的时候,会去所有类中搜索定义为FeignClient的接口,并自动注册到spring ioc容器中,然后会对所有使用client实现类的对象进行自动依赖注入。这里还有EurekaClient的注解是因为后面定义FeignClient的时候需要定义接口的服务名而不是ip地址,需要定义EurekaClient才能发现相关服务,并且实现软负载。
@SpringCloudApplication
@EnableFeignClients
@EnableEurekaClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
3. 创建Feign Client接口
下面来到最重要的一步,就是定义Feign的Client接口,这里Client接口其实就是对提供服务的restful接口的本地定义,定义好后,在其他类中就可以像使用RPC本地接口类一样使用远程服务接口了,想想我们用httpclient、okhttp是怎么实现报文接收的功能的,首先我们需要定义httpclient对象,按照服务端的接口要求组合json报文,然后定义是get还是post,不同的传输方法还需要调用不同的方法(doGet、doPost),这才将一个请求发出去,然后从inputstream中循环读取字节流或者从Reader中读取字符流,再将字符流反序列化成对象,全部需要编码实现,整个过程虽然结构很清晰但是很繁琐,为什么之前RPC很火,就是因为使用RPC会让client端调用远程服务接口简单化,就好像使用本地对象一样简单,但是使用RPC的最大的弊端就是每个client都需要维护一个服务端的client jar包,这个jar包中其实就是定义了接口,一旦服务端接口有变化,服务使用方就需要更新jar包,这就使得客户端对服务端产生了强依赖,feign就很好的解决了这个问题,在client和server端没有依赖的情况下,让client使用服务就像使用本地接口一样简单,废话不多少,下面来定义feign client的接口,这里服务端的接口就使用之前定义的getUser接口。
@FeignClient("usercenter-provider")
public interface UserFeignClient {
//Feign定义服务提供者接口
@RequestMapping(value = "/getUser", method = RequestMethod.POST, produces = {"application/charset=UTF-8"})
String getUser(@RequestBody String data);
@FeignClient("usercenter-provider")注解的意思是该接口里定义的方法全部是“usercenter-provider”这个serviceid提供的方法,注意这里的serviceid需要和eureka server里定义的服务提供方的名字一致,不然feign是无法找到相关服务的,feign内部集成了Ribbon所以通过serviceid找到服务后,会通过ribbon自动实现服务访问的负载均衡,可以通过定义ribbon的负载均衡方法来实现自己想要的,默认得是随机访问方法也可以定义成顺序、访问权重或者自定义负载算法,这里就使用了默认的负载,默认负载已经能够满足大部分需求了。在接口的方法前面需要定义该方法访问路径和访问方法和编码格式等信息,对于请求参数也可以通过@requestBody或者@RequestParameter的value方法进行设置,这里就使用和入参名同名的参数设定。是不是很简单,这样就定义好了远程服务端接口。
4. 远程服务接口使用
上面定义好了Feign Client接口,后面使用就很简单了,这里按照日常项目结构定义了service层和controller,将feign的接口调用放在了service的实现类中,在controller类中进行service的调用,这里需要注意一个问题,之前在测试的过程中自己遇到了,因为不小心写错了,犯了一个很低级的错误,找了1个小时才找到原因。。因为feign的client是通过@AutoWired启动的时候自动注入的,这就使得如果client的调用是在service里的时候需要将service也放在spring的ioc中进行托管,不然就会报你的Service没有定义,并且在Controller使用这个Service的时候也要通过ioc容器自动注入Service实现,不然会报client空指针的错误,如果调试过程中发现FeignClient调用的时候报nullpoint,基本就是由于ioc bean托管导致的问题,我就是因为写错了一行代码导致了这个问题。
UserServiceImpl.java
public class UserServiceImpl implements UserService {
@Autowired
private UserFeignClient userFeignC
public String getUSer(String data) {
return "Feign: " + userFeignClient.getUser(data);
UserController.java
@RestController
public class UserController {
@Autowired
private UserService userS
@RequestMapping(value = "/getUser", method = RequestMethod.POST, produces = {"application/charset=UTF-8"})
public String getUser(@RequestBody String data){
return userService.getUSer(data);
5. application.yml参数设置
在配置中主要是要配置eureka server集群的地址,因为需要定义在哪个eureka集群中找到feign使用的serviceid。
application:
name: springcloud-feign-ribbon
port: 8080
serviceUrl:
defaultZone: http://node1:8761/eureka/,http://node2:8762/eureka/
最后我们启动eureka server、usercenter-provider的服务,再启动本次写的应用。
下面通过httprequester来发起请求,地址栏输入,body栏输入{"name":"feiweiwei"},可以看到返回了Feign {"name":"feiweiwei"}
源码Git地址:
互联网金融架构师
www.monkey01.club
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
(git上的源码:https://gitee.com/rain7564/spring_microservices_study/tree/master/second-discovery-euraka) 何为服务发现 在许多分布式系统架构中,都需要去获取机器的物理地址(微服务实...
1 为什么需要服务发现 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB、KV,去掉重量级ESB),并且强调DevOps和快速演化。这就要求我们必须采用与一站式时代、泛SOA时代不同的技术栈,而Sp...
SpringCloud学习04--服务消费Ribbon和Feign RibbonRibbon 是一个基于HTTP和TCP客户端的负载均衡器,Feign中也使用了Ribbon,后面会介绍Feign的使用。 它可以在客户端配置ribbonServerList(服务端列表),然后...
断断续续看Ribbon的源码差不多也有7-8天了,总算告一段落。本文记录了这些天对源码的阅读过程与一些分析理解,如有不对还请指出。 友情提示:本文较长,请选择一个较为舒适的姿势来阅读 在之前介绍使用Ribbon进行服务消费的时候,我们用到了RestTemplate,但是熟悉...
今日读书:《刻意练习》之3每天5分钟,陪你一起成长…… 经过昨天和前天的读书,我们知道大脑具有无限的适应性,掌握了心理表征,你就像插上了翅膀一样,会不断取得进步。 今天我们就要动真格的了——怎样开始刻意练习。 01 刻意练习到底是个什么样子??下面这些特征可以帮你建立起刻意...
刚刚开始使用flask框架写了两个小程序。然后我先访问了第一个“Hello,Web”的小程序,运行通过,然后想看看第二个inputname的程序是不是写对,但是linux报错:socket.error: [Errno 98] Address already in use大概...
“街头摄影”!也称“街拍”或“扫街”。我认为街拍是提高摄影师技能的绝佳路径,因为它不但可以训练你的反应能力,还能训练观察力以及耐心,对机器的操作的熟练性。最重要的是考验你的脸皮厚度,对陌生人拍照,确实唐突的很....... 1. 灵感 街拍灵感最为重要,大街上琳琅满目,如果...
帘外雨稀明,独坐危楼,闻云雾空鸣;偶作痛,惊回梦,止千里寒霜泪。——虻、SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程
未接触 SpringBoot 之前,搭建一个普通的 WEB 工程往往需要花费30分钟左右,如果遇到点奇葩的问题耽搁的时间会更长一点,但自从用了SpringBoot 后,真正体会到什么叫分分钟搭建一个WEB,让我拥有更多的时间跟我的小伙伴们唠嗑了。使用 SpringBoot 后发现一切是如此的简单(还记得读书那会被JAR包,xml支配的恐惧吗,如今都可以说 good bye)
设计的目标
为所有使用 Spring 的开发者提供一个更简单,快速的入门体验
提供一些常见的功能、如监控、WEB容器,健康,安全等功能
干掉XML,遵循规范,开箱即用
SpringBoot 为我们提供了一系列的依赖包,所以需要构建工具的支持:Maven 或 Gradle。由于本人更习惯使用Maven所以后续案例都是基于Maven 与 IntelliJ IDEA,同时这里是基于最新的SpringBoot2编写的哦...
初次接触,我们先来看看如何创建一个Spring Boot项目,这里以IntelliJ IDEA为例,其他的IDE工具小伙伴们自行搜索创建方式。创建完项目后,各位小伙伴请认真、细心的对比下与传统的WEB工程有何区别(如:目录结构)。
点击File -& Project
如果用过 Eclipse/IDEA 等工具的,对创建项目肯定不会陌生,但为了照顾第一次使用的我贴上了图文
选择Spring Initializr
到这一步选择的时候,如图中选项的是Spring Initializr(官方的构建插件,需要联网),第二个是自己选择Maven构建,为了更好的适合初学者,我们将在本章用插件构建
填写项目基本信息
Group: 组织ID,一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为 org、com、cn等等,其中 org为非营利组织,com为商业组织。如阿里、淘宝(com.alibaba/com.taobao)
Artifact: 唯一标识符,一般是项目名称
Spring Initializr 为我们提供了很多的选项,不同的选项有不同的作用,在初期我们只需要依赖Web -& Web 就可以了,选择好依赖包之后点击Next -& Finish
#主函数,启动类,运行它如果运行了 Tomcat、Jetty、Undertow 等容器
-SpringbootApplication
#存放静态资源 js/css/images 等
#存放 html 模板文件
- templates
#主要的配置文件,SpringBoot启动时候会自动加载application.yml/application.properties
- application.yml
#测试文件存放目录
# pom.xml 文件是Maven构建的基础,里面包含了我们所依赖JAR和Plugin的信息
pom.xml 依赖
因为使用了 Spring Initializr 插件,所以如下的配置都不需要我们自己去写啦,需要注意的是版本要选择 RELEASE ,稳定版本BUG少
&?xml version="1.0" encoding="UTF-8"?&
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"&
&com.battcn&
&chapter1&
&0.0.1-SNAPSHOT&
&chapter1&
&我的用第一个SpringBoot工程&
&org.springframework.boot&
&spring-boot-starter-parent&
&2.0.1.RELEASE&
&org.springframework.boot&
&spring-boot-starter-web&
&org.springframework.boot&
&spring-boot-starter-test&
&org.springframework.boot&
&spring-boot-maven-plugin&
其它的依赖可以参考:
主函数入口
注意事项: 一个项目中切记不要出现多个 main 函数,否在在打包的时候 spring-boot-maven-plugin 将找不到主函数(主动指定打包主函数入口除外…)
* 我的第一个SpringBoot程序
* 其中 等同于 (@Controller 与)
@RestController
@SpringBootApplication
public class Chapter1Application {
public static void main(String[] args) {
SpringApplication.run(Chapter1Application.class, args);
@GetMapping("/demo1")
public String demo1() {
return "Hello battcn";
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -& {
System.out.println("来看看 SpringBoot 默认为我们提供的 Bean:");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
Arrays.stream(beanNames).forEach(System.out::println);
初窥配置文件
从启动日志中可以发现,SpringBoot 默认的端口是 8080 ,那么如果端口被占用了怎么办呢?不要慌,问题不大,配置文件分分钟解决你的困扰…
2018-04-20 16:14:46.725
INFO 11184 --- [
main] o.s.b.w.embedded.tomcat.TomcatWebServer
: Tomcat started on port(s): 8080 (http) with context path ''
修改默认配置
# 默认的 8080 我们将它改成 9090
server.port=9090
# 未定义上下文路径之前 地址是 http:
server.servlet.context-path=/chapter1
在启动一次看看日志
2018-04-20 16:47:05.716
INFO 12108 --- [
main] o.s.b.w.embedded.tomcat.TomcatWebServer
: Tomcat started on port(s): 9090 (http) with context path '/chapter1'
本次测试采用 junit 进行,当然也可以启动项目后直接访问 http://localhost:9090/chapter/demo1 进行测试
import org.junit.B
import org.junit.T
import org.junit.runner.RunW
import org.springframework.beans.factory.annotation.A
import org.springframework.boot.test.context.SpringBootT
import org.springframework.boot.test.web.client.TestRestT
import org.springframework.boot.web.server.LocalServerP
import org.springframework.http.ResponseE
import org.springframework.test.context.junit4.SpringR
import java.net.URL;
import static org.junit.Assert.assertE
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Chapter1ApplicationTests {
@LocalServerPort
private int
private URL
@Autowired
private TestRestT
public void setUp() throws Exception {
this.base = new URL("http://localhost:" + port + "/chapter1/demo1");
public void demo1() throws Exception {
ResponseEntity&String& response = template.getForEntity(base.toString(), String.class);
assertEquals(response.getBody(), "Hello battcn");
自定义Banner
SpringBoot 启动的时候我们可以看到如下内容,这一块其实是可以自定义的哦,而且在 2.X 版本中,它支持的格式从文本扩展到banner.txt、banner.jpg、banner.gif、banner.jpeg 等等,只需要在 resouces 目录下添加指定命名的文件即可
/\\ / ___'_ __ _ _(_)_ __
__ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
___)| |_)| | | | | || (_| |
|____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::
(v2.0.1.RELEASE)
目前很多大佬都写过关于 SpringBoot 的教程了,如有雷同,请多多包涵,本教程基于最新的 spring-boot-starter-parent:2.0.1.RELEASE编写,包括新版本的特性都会一起介绍…
battcn开源群(适合新手):
微信公众号(欢迎调戏):battcn
个人博客:
全文代码:
一起来学SpringBoot | 第九篇:整合Lettuce Redis
SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖...
SpringBoot的第一个程序helloworld
一开始编写第一个springboot程序helloworld时候,就会觉得不知所措,然后根据网上的一些文档看了一下,真的超级简单.入乡随俗,贴一下优点:
Spring Boot的主要优点:
一起来学SpringBoot | 第十一篇:集成Swagger在线调试
SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关...
一起来学SpringBoot | 第十五篇:actuator与spring-boot-admin 可以说的秘密
SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关...
一起来学SpringBoot | 第三篇:SpringBoot日志配置
SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖...
一起来学 SpringBoot | 第一篇:构建第一个 SpringBoot 工程
一起来学SpringBoot | 第七篇:整合Mybatis
SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖...
一起来学SpringBoot | 第十八篇:轻松搞定全局异常
SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关...
一起来学SpringBoot | 第十四篇:强大的 actuator 服务监控与管理
SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关...
一起来学SpringBoot | 第二十二篇:轻松搞定重复提交(本地锁)
SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关...
没有更多推荐了,实践“微服务”自然要学习如何做服务注册与发现
基于SpringBoot来进行微服务的学习,自然选择了与之息息相关的SpringCloud;当然可以选择其他的技术进行,比如dubbo
也可以用zookeeper来实现服务注册与发现,至于zookeeper来实现此功能好还是不好,各家之言都有
SpringCloud
Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems .
SpringCloud 包含了 Distributed/versioned configuration、Distributed/versioned configuration等很多子项目。
Distributed/versioned configuration
Service registration and discovery
Service-to-service calls
Load balancing
Circuit Breakers
Global locks
Leadership election and cluster state
Distributed messaging
服务注册与发现
SpringCloud模块
spring-cloud-starter-eureka-server
工程module
服务注册中心
服务module
服务注册中心
创建discovery module,并在 build.gradle中引入 spring-cloud-starter-eureka-server依赖
apply plugin: 'org.springframework.boot'
dependencyManagement {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:"+ springCloudVersion
repositories {
mavenCentral()
dependencies {
compile ('org.springframework.cloud:spring-cloud-starter-eureka-server')
baseName = 'discovery-bootcwenao'
通过注解 @EnableEurekaServer 提供注册中心服务
* $Id DiscoveryBootcwenaoApplication.java, v 0.1
9:56 cwenao Exp $$
@EnableEurekaServer
@SpringBootApplication
public class DiscoveryBootcwenaoApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(DiscoveryBootcwenaoApplication.class).web(true).run(args);
application.yml 配置eureka属性
port: 8761
hostname: discovery
registerWithEureka: false
fetchRegistry: false
service-url:
defaultZone: http:
创建服务module, 在build.gradle中引入 spring-cloud-starter-eureka
apply plugin: 'org.springframework.boot'
dependencyManagement {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:"+ springCloudVersion
dependencies {
compile('org.springframework.cloud:spring-cloud-starter-eureka')
compile('org.springframework.cloud:spring-cloud-stream')
sourceSets {
resources.srcDirs = ['src/main/resources', 'src/main/java']
resources.includes = ['**/*.xml', '**/*.yml']
baseName = 'apigateway-bootcwenao'
通过注解 @EnableDiscoveryClient 进行服务注册
@SpringBootApplication
@EnableDiscoveryClient
public class ApiGatewayBootcwenaoApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayBootcwenaoApplication.class, args);
application.yml 配置eureka属性
port: 10002
application:
name: apigateway
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http:
注册完成后,可以通过 spring.application.name 的配置来访问该服务
发现服务已经在注册中心上注册
服务注册中心启用用户名密码
通过配置applicaiton.yml用户名密码
enabled: true
password: abcd
配置服务提供方application.yml
hostname: configserver
prefer-ip-address: true
registerWithEureka: true
fetchRegistry: true
service-url:
defaultZone: http:
代码请移步
如有疑问请加公众号(K171),如果觉得对您有帮助请 github start
spring cloud之简单注册中心
废话不多说,直接进入正文,这次我要做一个spring cloud的简单注册中心。
第一步创建一个简单的springboot项目,这个我就不多说了,可以找找demo来看看。第二步在pom.xml中增加依...
Spring boot服务的注册与发现demo(一)
简单演示使用idea搭建Spring boot模块化项目结构搭建及Spring boot服务发现与注册 (该文章为作者笔记,只供参考,不要学习)原文地址:http://www.maoyupeng.co...
SpringBoot+Springcloud+SpringBootAdmin 服务发现注册与服务监控完美整合
Apache开源的SpringCloud与阿里开源的Dubbo一直是SOA架构服务调度框架的首选,前段时间公司尝试使用了Dubbo+Zookeeper架构模式,但是实践过程中发现几个比较重要的缺陷,虽...
使用SpringBoot开启微服务之旅(详细步骤)
https://www.tuicool.com/articles/YJZ3amq
微服务可以使你的代码解耦微服务可以使不同的团队专注于更小范围的工作职责、使用独立的技术、...
三、Eurake 服务注册与发现
3、 Eurake 服务注册与发现
3.1 基于Springboot构建Eurake服务
在第二节中《Springboot项目构建》 中的第三步 中选择如下组件: 左侧选择 cloud
非Spring Boot Web项目 注册节点到Eureka Server并提供服务
相信有很多团队在老Web项目(zookeeper,dubbo,tomcat)想要过渡到新的Eureka注册管理的Spring Boot都会遇到这样一个问题,新项目想调用老项目提供的服务,或者不想采用S...
SpringCloud 注册中心的高可用(tomcat下部署项目)
自己注册自己
将自己注册给别人
将别人注册进来
* 相关代码及配置如下:
org.springframework.boot
spring-boot-sta...
Spring Cloud 服务注册与发现(一)
Spring Cloud是一个基于Spring Boot实现云应用的开发工具。Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集。Spring Cloud...
Spring cloud服务的注册和发现
Spring cloud服务的注册和发现
可参考:http://blog.csdn.net/liaomin/article/details/
服务(serv...
没有更多推荐了,

我要回帖

更多关于 springboot启动端口 的文章

 

随机推荐