Download - Das kannste schon so machen
![Page 1: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/1.jpg)
Das kannste schon so machen…
André Goliath
![Page 2: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/2.jpg)
Disclaimer:This talk is bad
Because I had no timeBecause of the issues this talk is about
![Page 3: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/3.jpg)
(makes sense, right?)
![Page 4: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/4.jpg)
That being said…
![Page 5: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/5.jpg)
![Page 6: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/6.jpg)
Spring Boot & Netflix OSS StackWebServiceTemplate & Proxies
Jenkins & NPM
![Page 7: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/7.jpg)
Spring Boot & Netflix OSS StackWebServiceTemplate & Proxies
Jenkins & NPM
![Page 8: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/8.jpg)
You all know I´m a nice, calm, relaxed, chilled, error-forgiving
guy, right?
![Page 9: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/9.jpg)
![Page 10: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/10.jpg)
@ControllerAdvicepublic class GlobalControllerExceptionHandler extends ResponseEntityExceptionHandler { …
@ExceptionHandler({Exception.class}) private ResponseEntity<Object> handleAllUnknownExceptions(Exception ex) { return handleExceptionInternal(ex, null, null, HttpStatus.INTERNAL_SERVER_ERROR, null); }
@Override @ResponseBody protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
BaseResponse errorMessage = createErrorMessage(ex); HttpStatus returnStatus = status != null ? status : HttpStatus.INTERNAL_SERVER_ERROR;
ResponseStatus exResponseStatus = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class);
if (exResponseStatus != null) { returnStatus = exResponseStatus.value(); } return new ResponseEntity<>(errorMessage, headers, returnStatus); }
}
![Page 11: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/11.jpg)
@Configuration@EnableWebMvcpublic class DispatcherServletConfigurer{
@Bean public FSLDispatcherServletHandlerErrorConfigurator getDispatcherServletPostProcessor(){ return new FSLDispatcherServletHandlerErrorConfigurator(); }
public class FSLDispatcherServletHandlerErrorConfigurator implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws …{ if (bean instanceof DispatcherServlet) { DispatcherServlet disp = ((DispatcherServlet) bean); disp.setThrowExceptionIfNoHandlerFound(true); } return bean; }… }
![Page 12: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/12.jpg)
That´s so Spring Boot 1.2.x!(1.2 was released in Dec 2014, 1.3 in Nov 2015)
![Page 13: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/13.jpg)
spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false
(you still need the @ControllerAdvice though)
![Page 14: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/14.jpg)
NETFLIX OSS
![Page 15: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/15.jpg)
ConfigserverSpring Cloud ConfigService Registry eurekaReverse Proxy zuulCircuit Breaker hystrix
![Page 16: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/16.jpg)
Client
Reverse Proxy(ZUUL)
Service Registry(EUREKA) Config Server
![Page 17: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/17.jpg)
So how do you deliver the configuration
for all your microservices and environments?
![Page 18: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/18.jpg)
HINT: NOT IN ONE BIG ZIP FILE
![Page 19: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/19.jpg)
C:\YOURSTUFF\CONFIG-BAD\\+---development| global.yml| service-a.yml| service-b.yml| service-c.yml| | +---production| global.yml| service-a.yml| service-b.yml| service-c.yml| \---uat global.yml service-a.yml service-b.yml service-c.yml
![Page 20: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/20.jpg)
C:\YOURSTUFF\CONFIG-BAD\\+---development| global.yml| service-a.yml| service-b.yml| service-c.yml| | +---production| global.yml| service-a.yml| service-b.yml| service-c.yml| \---uat global.yml service-a.yml service-b.yml service-c.yml
C:\YOURSTUFF\CONFIG-GOOD\\|-- development.yml|-- production.yml|-- uat.yml| +---service-a| service-a-development.yml| service-a-production.yml| service-a-uat.yml| +---service-b| service-b-development.yml| service-b-production.yml| service-b-uat.yml| \---service-c service-c-development.yml service-c-production.yml service-c-uat.yml
![Page 21: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/21.jpg)
C:\YOURSTUFF\CONFIG-BAD\\+---development| global.yml| service-a.yml| service-b.yml| service-c.yml| | +---production| global.yml| service-a.yml| service-b.yml| service-c.yml| \---uat global.yml service-a.yml service-b.yml service-c.yml
C:\YOURSTUFF\CONFIG-GOOD\\|-- development.yml|-- production.yml|-- uat.yml| +---service-a| service-a-development.yml| service-a-production.yml| service-a-uat.yml| +---service-b| service-b-development.yml| service-b-production.yml| service-b-uat.yml| \---service-c service-c-development.yml service-c-production.yml service-c-uat.yml
Never usedashes In
service names!
![Page 22: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/22.jpg)
What is that zuul anyway?And what does it do?
AND HOW DO WE USE IT?
![Page 23: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/23.jpg)
@SpringBootApplication@Controller@EnableZuulProxypublic class ZuulApplication {
public static void main(String[] args) { new SpringApplicationBuilder(ZuulApplication.class) .web(true).run(args); }}
![Page 24: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/24.jpg)
ZUUL DOES MUCH MORE THINGS THEN WE SEE!
![Page 25: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/25.jpg)
![Page 26: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/26.jpg)
NOTE TO SELF:SPRING DOES NOT USE SEMANTIC
VERSIONING!
![Page 27: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/27.jpg)
![Page 28: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/28.jpg)
![Page 29: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/29.jpg)
Lessons learnedfrom working with Spring
![Page 30: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/30.jpg)
NEVER TRUST DEFAULT VALUES
![Page 31: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/31.jpg)
READ THE FRIENDLY MANUAL…
![Page 32: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/32.jpg)
… AND ESPECIALLYTHE RELEASE NOTES!
![Page 33: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/33.jpg)
Spring Boot & Netflix OSS StackWebServiceTemplate & Proxies
Jenkins & NPM
![Page 34: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/34.jpg)
private WebServiceTemplate attachProxy(WebServiceTemplate template) { if (config.getUseProxy()) { template.setProxy(new HttpHost(config.getProxyHost(), config.getProxyPort())) } return template; }}
![Page 35: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/35.jpg)
private WebServiceTemplate attachProxy(WebServiceTemplate template) { if (config.getUseProxy()) { if (senderForProxy == null) { HttpClient client = HttpClients.custom() .setProxy(new HttpHost(config.getProxyHost(), config.getProxyPort())) .build(); senderForProxy = new HttpComponentsMessageSender(client); } template.setMessageSender(senderForProxy); } return template; }}
![Page 36: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/36.jpg)
org.springframework.ws.client.WebServiceIOException: I/O error: null; nested exception is org.apache.http.client.ClientProtocolException
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:543)
...Caused by: org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909)
... 32 moreCaused by: org.apache.http.ProtocolException: Content-Length header already present
... 39 more
![Page 37: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/37.jpg)
![Page 38: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/38.jpg)
private WebServiceTemplate attachProxy(WebServiceTemplate template) { if (config.getUseProxy()) { if (senderForProxy == null) { HttpClient client = HttpClients.custom() .setProxy(new HttpHost(config.getProxyHost(), config.getProxyPort())) .addInterceptorFirst( new HttpComponentsMessageSender .RemoveSoapHeadersInterceptor() ) .build(); senderForProxy = new HttpComponentsMessageSender(client); } template.setMessageSender(senderForProxy); } return template; }}
![Page 39: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/39.jpg)
SSL Protocol Error: Handshake failure
![Page 40: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/40.jpg)
![Page 41: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/41.jpg)
private WebServiceTemplate attachProxy(WebServiceTemplate template) { if (config.getUseProxy()) { if (senderForProxy == null) { HttpClient client = HttpClients.custom() .useSystemProperties() .setProxy(new HttpHost(config.getProxyHost(), config.getProxyPort())) .addInterceptorFirst( new HttpComponentsMessageSender .RemoveSoapHeadersInterceptor() ) .build(); senderForProxy = new HttpComponentsMessageSender(client); } template.setMessageSender(senderForProxy); } return template; }}
![Page 42: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/42.jpg)
![Page 43: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/43.jpg)
400(a.k.a. „Bad Request“)
![Page 44: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/44.jpg)
400(a.k.a. least helpful HTTP
response code of all times.)
![Page 45: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/45.jpg)
…5 Hours of HTTP traffic comparison later…
SOAP-Namespaces?
Am I missing any HTTP header?Malformed XML?
No Proxy allowed? Still SSL issues?
![Page 46: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/46.jpg)
…5 Hours of HTTP traffic comparison later…
Am I missing any HTTP header?
![Page 47: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/47.jpg)
![Page 48: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/48.jpg)
I am sending one header too much.
Am I missing any HTTP header?
![Page 49: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/49.jpg)
private WebServiceTemplate attachProxy(WebServiceTemplate template) { if (config.getUseProxy()) { if (senderForProxy == null) { HttpClient client = HttpClients.custom() .useSystemProperties() .setProxy(new HttpHost(config.getProxyHost(), config.getProxyPort())) .addInterceptorFirst( new HttpComponentsMessageSender .RemoveSoapHeadersInterceptor() ) .build(); senderForProxy = new HttpComponentsMessageSender(client); senderForProxy.setAcceptGzipEncoding(false); } template.setMessageSender(senderForProxy); } return template; }}
![Page 50: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/50.jpg)
It took me about 5 full days to get this right.
![Page 51: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/51.jpg)
Lessons learnedfrom the proxy disaster
![Page 52: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/52.jpg)
Have the samecommunication infrastructure
on every(!) test setup
![Page 53: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/53.jpg)
No Proxy? Make your own.var http = require('http'), httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
var interceptingServer = http.createServer(function (req, res) { // define your custom logic to handle the request // and then proxy the request. proxy.web(req, res, {target: 'http://MyActualTargetService.com'});});
console.log("proxy listening on port 5050")interceptingServer.listen(5050);
https://github.com/nodejitsu/node-http-proxy
![Page 54: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/54.jpg)
Talking about JavaScript…
![Page 55: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/55.jpg)
Spring Boot & Netflix OSS StackWebServiceTemplate & Proxies
Jenkins & NPM
![Page 56: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/56.jpg)
![Page 57: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/57.jpg)
Node Package Manager v2is bad. Like, really bad.
![Page 58: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/58.jpg)
![Page 59: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/59.jpg)
![Page 60: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/60.jpg)
![Page 61: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/61.jpg)
So what’s the big deal?
![Page 62: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/62.jpg)
npm install
…on Senacor Hardware: 15 min…on Clients Dev. Machine: 20 min…on Jenkins:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
![Page 63: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/63.jpg)
Filesystem Size Used Avail Use% Mounted on.../dev/mapper/datavg-lv_optsoftware 492G 22G 446G 5% /opt/software
![Page 64: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/64.jpg)
Filesystem Size Used Avail Use% Mounted on.../dev/mapper/datavg-lv_optsoftware 492G 22G 446G 5% /opt/software
Filesystem Inodes IUsed IFree IUse% Mounted on.../dev/mapper/datavg-lv_optsoftware 32768000 32428987 39013 99% /opt/software
![Page 65: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/65.jpg)
Filesystem Size Used Avail Use% Mounted on.../dev/mapper/datavg-lv_optsoftware 492G 22G 446G 5% /opt/software
Filesystem Inodes IUsed IFree IUse% Mounted on.../dev/mapper/datavg-lv_optsoftware 32768000 32428987 39013 99% /opt/software
I lost track when the deepest node_modules pathwas about 2000 chars long…
![Page 66: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/66.jpg)
npm dedupe would help,but only if npm install worked at least once…
![Page 67: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/67.jpg)
Beware:Npm3 will be the default packagemanager starting with nodejs 5.x,and is a breaking change:
![Page 68: Das kannste schon so machen](https://reader035.vdokument.com/reader035/viewer/2022062523/58ecd56d1a28ab264f8b4621/html5/thumbnails/68.jpg)
Lessons learned:We started the project when NodeJS 4.x and npm 3.xwere still unstable.That time is gone. Go for it.