spring-cloud-square开发实战(三种类型全覆盖)

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

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

<square.dependency.version>0.4.0-SNAPSHOT</square.dependency.version>

pom

Demo project for Spring Cloud Square Retrofit Web

provider

eureka

consumer-okhttp

client

consumer-retrofit-okhttp

consumer-retrofit-webflux

org.springframework.cloud

spring-cloud-dependencies

${spring-cloud.version}

pom

import

org.springframework.cloud

spring-cloud-dependencies

${spring-cloud.version}

pom

import

com.squareup.okhttp3

okhttp

3.14.9

compile

ch.qos.logback

logback-classic

1.1.7

org.projectlombok

lombok

1.16.16

org.springframework.cloud

spring-cloud-square-okhttp

${square.dependency.version}

org.springframework.cloud

spring-cloud-square-retrofit

${square.dependency.version}

org.springframework.cloud

spring-boot-starter-webflux

${square.dependency.version}

org.springframework.cloud

spring-cloud-square-retrofit-webclient

${square.dependency.version}

maven-deploy-plugin

true

org.springframework.boot

spring-boot-maven-plugin

spring-snapshots

Spring Snapshots

https://repo.spring.io/snapshot

true

spring-milestones

Spring Milestones

https://repo.spring.io/milestone

false

spring-snapshots

Spring Snapshots

https://repo.spring.io/snapshot

true

spring-milestones

Spring Milestones

https://repo.spring.io/milestone

false

注册中心eureka

  • eureka应用并没有什么特别之处,pom.xml如下:
<?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”>

spring-cloud-square-tutorials

com.bolingcavalry

1.0-SNAPSHOT

4.0.0

eureka

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

com.bolingcavalry.eureka.EurekaApplication

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

org.springframework.cloud

spring-cloud-dependencies

${spring-cloud.version}

pom

import

org.springframework.boot

spring-boot-maven-plugin

com.netflix.eureka

eureka-core

com.netflix.eureka

eureka-client

maven-deploy-plugin

true

  • 中规中矩的配置文件application.yml,端口是8761,后面的应用也要保持一致:

server:

port: 8761

spring:

application:

name: eureka

eureka:

client:

registerWithEureka: false

fetchRegistry: false

server:

waitTimeInMsWhenSyncEmpty: 0

  • 启动类EurekaApplication.java,记得用注解EnableEurekaServer开启eureka服务:

package com.bolingcavalry.eureka;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer

public class EurekaApplication {

public static void main(String[] args) throws Exception {

SpringApplication.run(EurekaApplication.class, args);

}

}

  • eureka应用已经完成,接下来是服务提供者了

服务提供者provider

  • -新建名为provider的应用,pom.xml如下,可见是个普通的web工程,会将自己注册到eureka上去:
<?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”>

spring-cloud-square-tutorials

com.bolingcavalry

1.0-SNAPSHOT

4.0.0

provider

jar

com.bolingcavalry

client

${project.version}

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-context

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

com.bolingcavalry.provider.ProviderApplication

repackage

  • 配置文件application.yml:

spring:

application:

name: provider

server:

port: 18080

eureka:

client:

serviceUrl:

defaultZone: http://localhost:8761/eureka/

  • 启动类ProviderApplication .java:

package com.bolingcavalry.provider;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class ProviderApplication {

public static void main(String[] args) {

SpringApplication.run(ProviderApplication.class, args);

}

}

  • web服务类,可见对外提供了两个接口hello-str和hello-obj,前者返回字符串,或者返回对象:

package com.bolingcavalry.provider.controller;

import com.bolingcavalry.client.HelloResponse;

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.GetMapping;

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

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

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.List;

import java.util.Random;

@RestController

public class Hello {

public static final String HELLO_PREFIX = “Hello World”;

@Autowired

DiscoveryClient client;

/**

  • 随机取一个provider实例,返回其描述信息,

  • 如果只有一个provider实例时,返回的就是当前服务信息

  • @return

*/

private String providerDescription() {

List instances = client.getInstances(“provider”);

ServiceInstance selectedInstance = instances

.get(new Random().nextInt(instances.size()));

return String.format(“serviceId [%s], host [%s], port [%d]”,

selectedInstance.getServiceId(),

selectedInstance.getHost(),

selectedInstance.getPort());

}

private String dateStr(){

return new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”).format(new Date());

}

@GetMapping(“/hello-str”)

public String helloStr() {

List instances = client.getInstances(“provider”);

ServiceInstance selectedInstance = instances

.get(new Random().nextInt(instances.size()));

return HELLO_PREFIX

  • " : "

  • providerDescription()

  • ", "

  • dateStr();

}

@GetMapping(“/hello-obj”)

public HelloResponse helloObj(@RequestParam(“name”) String name) {

return new HelloResponse(name, dateStr(), providerDescription());

}

}

  • 这个provider应用算是个最朴实无华的web服务了

启动服务

  • 现在可以将eureka和provider服务先后启动,这样后面的应用编码完成后可以直接测试

consumer-okhttp,基于spring-cloud-square的okhttp能力

  • 接下来要创建的应用consumer-okhttp,使用的是spring-cloud-square三种能力的第一种:okhttp

  • pom.xml内容如下,重点是spring-cloud-square-okhttp和spring-cloud-starter-loadbalancer这两个库的引入:

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

spring-cloud-square-tutorials

com.bolingcavalry

1.0-SNAPSHOT

4.0.0

consumer-okhttp

jar

com.bolingcavalry

client

${project.version}

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-starter-webflux

test

org.projectlombok

lombok

com.squareup.okhttp3

okhttp

compile

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

org.springframework.cloud

spring-cloud-square-okhttp

0.4.0-SNAPSHOT

compile

org.springframework.cloud

spring-cloud-starter-loadbalancer

org.springframework.boot

spring-boot-maven-plugin

com.bolingcavalry.ConsumerApplication

repackage

  • 配置文件application.yml,还是常见的那几个配置:应用名、端口、eureka:

spring:

application:

name: consumer-okhttp

server:

port: 18081

eureka:

client:

serviceUrl:

defaultZone: http://localhost:8761/eureka/

  • 启动类:

package com.bolingcavalry.consumer;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class OkhttpApplication {

public static void main(String[] args) {

SpringApplication.run(OkhttpApplication.class, args);

}

}

  • 接下来是重要的配置类OkHttpClientConfig.java,用于实例化OkHttpClient.Builder对象并注册到spring环境:

package com.bolingcavalry.consumer;

import okhttp3.OkHttpClient;

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

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

class OkHttpClientConfig{

@Bean

@LoadBalanced

public OkHttpClient.Builder okHttpClientBuilder() {

return new OkHttpClient.Builder();

}

}

  • 然后就可以使用这个Builder来创建OkHttpClient实例了,如下所示,可见入参request的url字段里使用了服务名provider,相当于OkHttpClient内如也能通过服务名取得具体的服务地址,至于是如何获取的,会在后面的文章详细分析,整段代码除了url使用服务名,并没有什么值得关注的地方了,普通的OkHttpClient使用而已:

package com.bolingcavalry.consumer.controller;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.Response;

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

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

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

import java.io.IOException;

@RestController

public class RemoteHello {

@Autowired

private OkHttpClient.Builder builder;

@GetMapping(“/remote-str”)

public String hello() throws IOException {

// 直接使用服务名

Request request = new Request.Builder().url(“http://provider/hello-str”).build();

// 远程访问

Response response = builder.build().newCall(request).execute();

return "get remote response : " + response.body().string();

}

}

  • 接下来看看单元测试代码,使用MockMvcRequestBuilders构造http请求,检查返回码和返回内容:

package com.bolingcavalry.consumer.controller;

import com.bolingcavalry.client.Constants;

import lombok.extern.slf4j.Slf4j;

import org.junit.jupiter.api.Test;

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

import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.http.MediaType;

import org.springframework.test.web.servlet.MockMvc;

import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import static org.hamcrest.Matchers.containsString;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest

@AutoConfigureMockMvc

@Slf4j

class RemoteHelloTest {

@Autowired

private MockMvc mvc;

@Test

void hello() throws Exception {

String responseString = mvc.perform(MockMvcRequestBuilders.get(“/remote-str”).accept(MediaType.APPLICATION_JSON))

.andExpect(status().isOk())

.andExpect(content().string(containsString(Constants.HELLO_PREFIX)))

.andDo(print())

.andReturn()

.getResponse()

.getContentAsString();

log.info(“response in junit test :\n” + responseString);

}

}

  • 如果eureka和provider都运行起来了,那么此时可以直接运行单元测试类,顺利通过测试,如下图:

在这里插入图片描述

consumer-retrofit-okhttp,基于spring-cloud-square的okhttp能力

  • 接下来的两个应用都使用了当下热门的retrofit,再搭配Spring Cloud LoadBalance实现服务注册发现,当然了retrofit自身无法完成网络请求处理,要依赖其他库,先看okhttp库的

  • 新建应用consumer-retrofit-okhttp,其pom.xml如下,要注意的必须依赖spring-cloud-square-retrofit和spring-cloud-square-okhttp,另外,为了:

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

spring-cloud-square-tutorials

com.bolingcavalry

1.0-SNAPSHOT

4.0.0

consumer-retrofit-okhttp

com.bolingcavalry

client

${project.version}

org.springframework.boot

spring-boot-starter-actuator

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

org.springframework.cloud

spring-cloud-square-retrofit

0.4.0-SNAPSHOT

org.springframework.cloud

spring-cloud-square-okhttp

0.4.0-SNAPSHOT

org.springframework.boot

spring-boot-starter-test

test

maven-deploy-plugin

true

org.springframework.boot

spring-boot-maven-plugin

  • 配置文件:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

[外链图片转存中…(img-VOy3lAGO-1712074855315)]

JVM面试专题

[外链图片转存中…(img-dutP6n2y-1712074855315)]

Java并发面试专题

[外链图片转存中…(img-pur8zL2U-1712074855315)]

Kafka面试专题

[外链图片转存中…(img-YruRa8wP-1712074855316)]

MongDB面试专题

[外链图片转存中…(img-ujYOYXJM-1712074855316)]

MyBatis面试专题

[外链图片转存中…(img-2f2h7J52-1712074855316)]

MySQL面试专题

[外链图片转存中…(img-1i87WBzZ-1712074855316)]

Netty面试专题

[外链图片转存中…(img-LhAReAHr-1712074855316)]

RabbitMQ面试专题

[外链图片转存中…(img-TpVZou60-1712074855317)]

Redis面试专题

[外链图片转存中…(img-WVz0cPyT-1712074855317)]

Spring Cloud面试专题

[外链图片转存中…(img-pyrourhY-1712074855317)]

SpringBoot面试专题

[外链图片转存中…(img-Gnff8fZo-1712074855317)]

zookeeper面试专题

[外链图片转存中…(img-O6y1e01a-1712074855318)]

常见面试算法题汇总专题

[外链图片转存中…(img-HihVifwc-1712074855318)]

计算机网络基础专题

[外链图片转存中…(img-75EBr9um-1712074855318)]

设计模式专题

[外链图片转存中…(img-JvYMWD2T-1712074855318)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值