├── README.md
├── Spring-Boot-Micro-Currency-Conversion-Service
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── MavenWrapperDownloader.java
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── Dockerfile
├── currency-conversion-service.yaml
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── example
│ │ │ └── currencyconversion
│ │ │ ├── SpringBootMicroCurrencyConversionServiceApplication.java
│ │ │ ├── controller
│ │ │ └── CurrencyConversionController.java
│ │ │ ├── model
│ │ │ └── CurrencyConversionBean.java
│ │ │ └── proxy
│ │ │ └── CurrencyExchangeServiceProxy.java
│ └── resources
│ │ └── application.properties
│ └── test
│ └── java
│ └── com
│ └── example
│ └── currencyconversion
│ └── SpringBootMicroCurrencyConversionService
│ └── SpringBootMicroCurrencyConversionServiceApplicationTests.java
├── Spring-Boot-Micro-Forex-Service
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── MavenWrapperDownloader.java
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── Dockerfile
├── forex-service.yaml
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── example
│ │ │ └── forex
│ │ │ ├── SpringBootMicroForexServiceApplication.java
│ │ │ ├── controller
│ │ │ └── ForexController.java
│ │ │ ├── dao
│ │ │ └── ExchangeValueRepository.java
│ │ │ └── model
│ │ │ └── ExchangeValue.java
│ └── resources
│ │ ├── application.properties
│ │ └── data.sql
│ └── test
│ └── java
│ └── com
│ └── example
│ └── forex
│ └── SpringBootMicroForexService
│ └── SpringBootMicroForexServiceApplicationTests.java
└── screens
├── analyticsPlugin.png
├── apiGateway.png
├── authentication.png
├── clientToServiceCommunication.png
├── communityvsentreprise.png
├── docker-containers-1.png
├── gateway-stack-2.png
├── kong-conclusion.png
├── kong.png
├── konga-connection.png
├── securityPlugin.png
├── serverlessPlugin.png
├── test
└── traficControlPlugin.png
/README.md:
--------------------------------------------------------------------------------
1 | Please feel free to contact me if you need any further information https://www.linkedin.com/in/anas-tayaa-37b249163/
2 | # Kong API Gateway and Spring Boot Microservices
3 | ## Context
4 | Working with a microservices API gateway can greatly reduce coding efforts, make applications far more efficient, and decrease
5 | errors all at that same time. An advantage of using microservices is that we don’t have to interact with a huge code base.
6 | Microservices are small and flexible. we can choose precisely which bits of code you want to interact with and from where
7 | those bits come. It’s possible to mix and match bits of code as needed.
8 |
9 | However, in a microservices architecture, each microservice exposes a set of (typically) fine-grained endpoints. This fact can impact the client-to-microservice communication.
10 | ### Direct client-to-microservice communication
11 | A possible approach is to use a direct client-to-microservice communication architecture. In this approach, a client app can make
12 | requests directly to some of the microservices.
13 |
14 | 
15 |
16 | In this approach, each microservice has a public endpoint, sometimes with a different TCP port for each microservice.
17 |
18 | In a production environment based on a cluster, that URL would map to the load balancer used in the cluster, which in turn
19 | distributes the requests across the microservices. In production environments, we could have an Application Delivery Controller
20 | (ADC) between microservices and the Internet. This acts as a transparent tier that not only
21 | performs load balancing, but secures your services by offering SSL termination. This improves the load of hosts by
22 | offloading CPU-intensive SSL termination and other routing duties to the ADC. In any case, a load balancer and ADC are transparent
23 | from a logical application architecture point of view.
24 |
25 | A direct client-to-microservice communication architecture could be good enough for a small microservice-based application,
26 | especially if the client app is a server-side web application like an ASP.NET MVC app. However, when you build large and complex
27 | microservice-based applications (for example, when handling dozens of microservice types), and especially when the client apps
28 | are remote mobile apps or SPA web applications, that approach faces a few issues.
29 |
30 | Let’s imagine we are building an online store that uses the Microservice architecture pattern and that we are implementing
31 | the product details page. we need to develop multiple versions of the product details user interface:
32 | * HTML5/JavaScript-based UI for desktop and mobile browsers - HTML is generated by a server-side web application
33 | * Native Android and iPhone clients - these clients interact with the server via REST APIs
34 |
35 | In addition, the online store must expose product details via a REST API for use by 3rd party applications.
36 |
37 | A product details UI can display a lot of information about a product. For example, the Amazon.com details page for POJOs
38 | in Action displays:
39 | * Basic information about the book such as title, author, price, etc.
40 | * Your purchase history for the book
41 | * Availability
42 | * Buying options
43 | * Other items that are frequently bought with this book
44 | * Other items bought by customers who bought this book
45 | * Customer reviews
46 | * Sellers ranking
47 | * ...
48 |
49 | Since the online store uses the Microservice architecture pattern the product details data is spread over multiple services.
50 | For example:
51 | * Product Info Service - basic information about the product such as title, author
52 | * Pricing Service - product price
53 | * Order service - purchase history for product
54 | * Inventory service - product availability
55 | * Review service - customer reviews …
56 |
57 | Consequently, the code that displays the product details needs to fetch information from all of these services.
58 | #### Problem
59 | How do the clients of a Microservices-based application access the individual services?
60 | #### Forces
61 |
62 |
63 | * The granularity of APIs provided by microservices is often different than what a client needs. Microservices typically
64 | provide fine-grained APIs, which means that clients need to interact with multiple services.
65 | For example, as described above, a client needing the details for a product needs to fetch data from numerous services.
66 |
67 | * Different clients need different data. For example, the desktop browser version of a product details page desktop is
68 | typically more elaborate then the mobile version.
69 |
70 | * Network performance is different for different types of clients. For example, a mobile network is typically much slower
71 | and has much higher latency than a non-mobile network. And, of course, any WAN is much slower than a LAN. This means that
72 | a native mobile client uses a network that has very difference performance characteristics than a LAN used
73 | by a server-side web application. The server-side web application can make multiple requests to backend
74 | services without impacting the user experience where as a mobile client can only make a few.
75 |
76 | * The number of service instances and their locations (host+port) changes dynamically
77 |
78 | * Partitioning into services can change over time and should be hidden from clients
79 |
80 | * Services might use a diverse set of protocols, some of which might not be web friendly
81 | #### Solution
82 | Implement an API gateway that is the single entry point for all clients. The API gateway handles requests in one of two ways.
83 | Some requests are simply proxied/routed to the appropriate service. It handles other requests by fanning out to multiple
84 | services.
85 | ### API Gateways
86 | In a microservices architecture, the client apps usually need to consume functionality from more than one microservice.
87 | If that consumption is performed directly, the client needs to handle multiple calls to microservice endpoints.
88 | What happens when the application evolves and new microservices are introduced or existing microservices are updated?
89 | If the application has many microservices, handling so many endpoints from the client apps can be a nightmare.
90 | Since the client app would be coupled to those internal endpoints, evolving the microservices in the future can cause
91 | high impact for the client apps.
92 |
93 | When we design and build large or complex microservice-based applications with multiple client apps, a good approach to consider
94 | can be an API Gateway. This is a service that provides a single-entry point for certain groups of microservices. It's similar
95 | to the Facade pattern from object-oriented design, but in this case, it's part of a distributed system. The API Gateway pattern
96 | is also sometimes known as the "backend for frontend" (BFF) because we build it while thinking about the needs of the client app.
97 |
98 | Therefore, the API gateway sits between the client apps and the microservices. It acts as a reverse proxy, routing requests
99 | from clients to services. It can also provide additional cross-cutting features such as authentication, SSL termination,
100 | and cache.
101 |
102 | 
103 |
104 | This example shows the API Gateway pattern implementation.
105 | #### Resulting context
106 | Using an API gateway has the following benefits:
107 |
108 | * Insulates the clients from how the application is partitioned into microservices
109 | * Insulates the clients from the problem of determining the locations of service instances
110 | * Provides the optimal API for each client
111 | * Reduces the number of requests/roundtrips. For example, the API gateway enables clients to retrieve data from multiple
112 | services with a single round-trip. Fewer requests also means less overhead and improves the user experience.
113 | An API gateway is essential for mobile applications.
114 | * Simplifies the client by moving logic for calling multiple services from the client to API gateway
115 | * Translates from a “standard” public web-friendly API protocol to whatever protocols are used internally
116 | ## Kong API Gateway
117 | ### Definition
118 | Kong is Orchestration Microservice API Gateway. Kong provides a flexible abstraction layer that securely manages communication
119 | between clients and microservices via API. Also known as an API Gateway, API middleware or in some cases Service Mesh.
120 | It is available as open-source project in 2015, its core values are high performance and extensibility.
121 |
122 | Kong is a Lua application running in Nginx and made possible by the lua-nginx-module.
123 |
124 | Kong can help by acting as a gateway (or a sidecar) for microservices requests while providing load balancing, logging,
125 | authentication, rate-limiting, transformations, and more through plugins.
126 |
127 | 
128 |
129 | Once the Kong gateway is running, it will expose two endpoints:
130 | * A proxy endpoint where consumers can send all their traffic to;
131 | * A management endpoint, also known as Kong Management API, to configure the gateway itself.
132 |
133 | Administrators can use the Admin REST API or CLI to configure the gateway which allows them to fully script repetitive tasks.
134 | However, there is no out-of-the-box support for infrastructure-as-code to manage your gateway.
135 |
136 | Every gateway is backed by a data store that contains all the relevant configuration which can be stored in Apache Cassandra
137 | or PostgreSQL. This is also where Kong shines as it is a cluster-based technology that allows to easily scale out by adding
138 | more nodes, but it still only requires one data store making it easier to manage.
139 |
140 | Here is a bird’s-eye overview of the gateway stack:
141 |
142 | 
143 | ### Features and Plugins
144 | Kong provide a collection of plugins that accelerate development time:
145 |
146 | * Authentication plugin that we could choose from Basic authentication, JWT, LDAP, OAUTH2;
147 | * Security plugin that additional security layers such as ACL, CORS, Dynamic SSL, IP Restriction;
148 | * Traffic control plugin is a very useful for limited cost such as rate limiting, request size limiting, response rate limiting;
149 | * Serverless – Invoke serverless functions via APIs
150 | * Analytics and monitoring plugin that visualise, inspect and monitor API traffic such as Prometheus, data dog and Runscope;
151 | * Transformation plugin that transform request and responses on the fly such as Request Transformer, Response Transformer;
152 | * Logging plugin that log request and response data using the best transport for your infrastructure: TCP, UDP, HTTP, StatsD,
153 | Syslog;
154 | * ...
155 | ### Distributions
156 | * Kong Docker: A Dockerfile for running Kong in Docker.
157 | * Kong Packages: Pre-built packages for Debian, Red Hat, and OS X distributions (shipped with each release).
158 | * Kong Vagrant: A Vagrantfile for provisioning a development-ready environment for Kong.
159 | * Kong Homebrew: Homebrew Formula for Kong.
160 | * Kong CloudFormation: Kong in a 1-click deployment for AWS EC2.
161 | * Kong AWS AMI: Kong AMI on the AWS Marketplace.
162 | * Kong on Microsoft Azure: Run Kong using Azure Resource Manager.
163 | * Kong on Heroku: Deploy Kong on Heroku in one click.
164 | * Kong and Instaclustr: Let Instaclustr manage your Cassandra cluster.
165 | * Kubernetes Ingress Controller for Kong: Use Kong for Kubernetes Ingress.
166 | * Nightly Builds: Builds of the master branch available every morning at about 9AM PST.
167 | ### Kong Community Edition vs Entreprise Edition
168 |
169 | Kong Enterprise takes API management a step further and comes with all the tooling that we need to manage a full-blown
170 | infrastructure.
171 |
172 | 
173 |
174 |
175 | ## Getting Started
176 | ### Pre-requise
177 | * Operating system (Linux, Windows, MacOS...);
178 | * Docker.
179 | ### Kong Setup
180 | #### 1.1 Create docker network
181 | First create docker network.
182 | ```bash
183 | docker network create neoxia-net
184 | ```
185 | #### 1.2 Initialize database
186 | Kong can interface with either Cassandra or Postgres. I this example we will use Cassandra DB.
187 | ##### NB:
188 | The two main reasons why one would choose Cassandra as Kong's datastore are:
189 | - An ease to create a distributed setup (ideal for multi-region);
190 | - Ease to scale
191 | ```bash
192 | docker run -d --name neoxia-database \
193 | --network=neoxia-net \
194 | -p 9042:9042 \
195 | cassandra:3
196 | ```
197 | Then prepare the database for Kong.
198 | ```bash
199 | docker run --rm \
200 | --network=neoxia-net \
201 | -e "KONG_DATABASE=cassandra" \
202 | -e "KONG_CASSANDRA_KEYSPACE=neoxia" \
203 | -e "KONG_CASSANDRA_CONTACT_POINTS=neoxia-database" \
204 | kong:latest kong migrations bootstrap
205 | ```
206 | #### 1.3 Initialize kong
207 | ```bash
208 | docker run -d --name neoxia-container\
209 | --network=neoxia-net \
210 | -e "KONG_DATABASE=cassandra" \
211 | -e "KONG_CASSANDRA_KEYSPACE=neoxia" \
212 | -e "KONG_CASSANDRA_CONTACT_POINTS=neoxia-database" \
213 | -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
214 | -p 8000:8000 \
215 | -p 8443:8443 \
216 | -p 8001:8001 \
217 | -p 8444:8444 \
218 | kong:latest
219 | ```
220 | After that, we have two running docker containers, one for cassandra DB and another for kong instance.
221 |
222 | 
223 |
224 | Check Kong Instance.
225 | ```bash
226 | curl -i http://localhost:8001
227 | ```
228 | ### Setup API server routing using Spring boot microservices
229 | Clone this repository to your local machine.
230 | #### 2.1 Create the Component
231 | change location to Spring-Boot-Micro-Forex-Service folder, build a new image and run a new container.
232 | ```bash
233 | cd pring-Boot-Micro-Forex-Service
234 | docker build -t forex-image .
235 | docker run --name forex-container --network=neoxia-net -p 8098:8098 forex-image
236 | ```
237 | The server app is listned on port 8098 with endpoint /currency-exchange/from/EUR/to/INR:
238 | http://localhost:8098/currency-exchange/from/EUR/to/INR
239 |
240 | We can verify the connected containers to the neoxia-net docker network:
241 | ```bash
242 | docker network inspect neoxia-net
243 | ```
244 | #### 2.2 Declare the Component with Kong
245 | ##### 2.2.1 Create the service
246 | Service refer to the upstream APIs and microservices that kong manages.
247 | ```bash
248 | curl -i -X POST \
249 | --url http://localhost:8001/services/ \
250 | --data 'name=forex-service-v1' \
251 | --data 'url=http://172.18.0.5:8098/currency-exchange/from/EUR/to/INR'
252 | ```
253 | ###### NB:
254 | 172.18.0.5 is the address of the component container. In this case forex-container.
255 | ##### 2.2.2 Create the route
256 | One route can be associated with one service, and this later can have one to many route to an upstream.
257 | ```bash
258 | curl -i -X POST \
259 | --url http://localhost:8001/services/forex-service-v1/routes \
260 | --data 'name=forex-route-v1' \
261 | --data 'paths[]=/forex-v1'
262 | ```
263 | Kong expose the created API at the port 8000. In this case we can visit the created route by:
264 | ```bash
265 | curl curl http://localhost:8000/forex-v1
266 | ```
267 | ##### 2.2.3 Apply plugins to the service
268 |
269 | Before starting applying plugins to services or routes. We will use an open source UI that allow us to create services, routes, plugins ... This UI is named Konga!
270 | ###### 2.2.3.1 Setting up konga UI
271 | Let's create an docker container for konga.
272 | ```bash
273 | docker run -p 1337:1337 \
274 | --network neoxia-net \
275 | --name konga \
276 | -e "NODE_ENV=development" \
277 | pantsel/konga
278 | ```
279 | Now Konga is exposed at 1337 port.
280 | First, we will connect konga with kong admin api.
281 | ###### NB:
282 | 172.18.0.3 is the kong container address
283 |
284 | 
285 |
286 | ###### 2.2.3.2 Add the Authentication plugin
287 | We can choose between a set of plugins to protect our services with an authentication layer.
288 |
289 | 
290 |
291 | For example to apply key auth plugin with CLI we can use the following command:
292 | ```bash
293 | curl -i -X POST \
294 | --url http://localhost:8001/services/forex-service-v1/plugins/ \
295 | --data 'name=key-auth'
296 | ```
297 | This example create an key auth plugin applied to the forex-service-v1 service.
298 |
299 | To access the API we should create an consumer, and affect to it an api key.
300 | ```bash
301 | curl -i -X POST \
302 | --url http://localhost:8001/consumers/ \
303 | --data "username=forex-consumer"
304 | ```
305 | ```bash
306 | curl -i -X POST \
307 | --url http://localhost:8001/consumers/forex-consumer/key-auth/ \
308 | --data 'key=123456'
309 | ```
310 | ###### 2.2.3.3 Add the security plugin
311 | With security plugins, we can apply ACL(Access Control List), CORS, IP restriction or Bot detection.
312 |
313 | 
314 |
315 | For example to apply ACL plugin with CLI we can use the following command:
316 | ```bash
317 | curl -X POST http://localhost:8001/services/forex-service-v1/plugins \
318 | --data "name=acl" \
319 | --data "config.whitelist=acl_group" \
320 | --data "config.hide_groups_header=true"
321 | ```
322 | Now we will associate a group to a consumer:
323 | ```bash
324 | curl -X POST http://localhost:8001/consumers/forex-consumer/acls \
325 | --data "group=acl_group"
326 | ```
327 | The api is protected with an api key and access control list.
328 | ###### 2.2.3.4 Add the Traffic Control plugin
329 | With the traffic control plugin we can Manage, throttle and restrict inbound and outbound API traffic.
330 |
331 | 
332 |
333 | To apply Rate limiting plugin with CLI we can use the following command:
334 | ```bash
335 | curl -X POST http://localhost:8001/services/forex-service-v1/plugins \
336 | --data "name=rate-limiting" \
337 | --data "config.minute=2" \
338 | --data "config.hour=100"
339 | ```
340 | Now we can use the exposed api 2 times by minute and 100 times by hour.
341 | ###### 2.2.3.5 Add the serverless plugin
342 | Kong can invoke serverless functions in combination with other plugins:
343 |
344 | 
345 |
346 | In this section we will call an AWS lambda function:
347 | ###### Step by step guide
348 | * First, let’s create an execution role called LambdaExecutor for our lambda function. In IAM Console create a new Role choosing the AWS Lambda service, there will be no policies as our function in this example will simply execute itself giving us back an hardcoded JSON as response without accessing other AWS resources.
349 | * Now let’s create a user named KongInvoker, used by our Kong API gateway to invoke the function. In IAM Console create a new user, must be provided to it programmatic access via Access and Secret keys; then will attach existing policies directly particularly the AWSLambdaRole predefined. Once the user creation is confirmed, store Access Key and Secret Key in a safe place.
350 | * Now we need to create the lambda function itself, will do so in N.Virginia Region (code us-east-1). In Lambda Management, create a new function Mylambda, there will be no blueprint as we are going to paste the code below; for the execution role let’s choose an existing role specifically LambdaExecutor created previously
351 | Use the inline code below to have a simple JSON response in return, note this is code for Python 3.6 interpreter.
352 | ```bash
353 | import json
354 | def lambda_handler(event, context):
355 | """
356 | If is_proxy_integration is set to true :
357 | jsonbody='''{"statusCode": 200, "body": {"response": "yes"}}'''
358 | """
359 | jsonbody='''{"response": "yes"}'''
360 | return json.loads(jsonbody)
361 | ```
362 | * Finally we setup a Service & Route in Kong and link it to the function just created.
363 | ```bash
364 | curl -X POST http://kong:8001/services/forex-service-v1/plugins \
365 | --data 'name=aws-lambda' \
366 | --data-urlencode 'config.aws_key={KongInvoker user key}' \
367 | --data-urlencode 'config.aws_secret={KongInvoker user secret}' \
368 | --data 'config.aws_region=us-east-1' \
369 | --data 'config.function_name=MyLambda'
370 | ```
371 | ###### 2.2.3.6 Add the Analytics & Monitoring plugin
372 | This plugin is used to Visualize, inspect and monitor APIs and microservices traffic.
373 |
374 | 
375 |
376 | We can apply promotheus plugin by using the following command:
377 | ```bash
378 | curl -X POST http://localhost:8001/services/forex-service-v1/plugins \
379 | --data "name=prometheus"
380 | ```
381 | Kong expose prometheus metrics in:
382 | ```bash
383 | http://localhost:8001/metrics
384 | ```
385 | ###### 2.2.3.7 Add the Logging plugin
386 | We can log requests and response data using the logging plugin.
387 |
388 | 
389 |
390 | To apply file log plugin we will use the following command:
391 | ```bash
392 | curl -X POST http://localhost:8001/services/forex-service-v1/plugins \
393 | --data "name=file-log" \
394 | --data "config.path=/tmp/file.log"
395 | ```
396 | This plugin will log HTTP request and response data in /tmp/file.log file.
397 | ## Conclusion
398 | Kong is a scalable, open source API Layer (also known as an API Gateway, or API Middleware). Kong runs in front of any RESTful API and is extended through Plugins, which provide extra functionality and services beyond the core platform.
399 |
400 | 
401 |
402 | Once Kong is running, every request being made to the API will hit Kong first, and then it will be proxied to the final API. In between requests and responses Kong will execute any plugin that we decided to install, empowering our APIs. Kong effectively becomes the entry point for every API request.
403 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**
5 | !**/src/test/**
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 |
30 | ### VS Code ###
31 | .vscode/
32 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/.mvn/wrapper/MavenWrapperDownloader.java:
--------------------------------------------------------------------------------
1 | /*
2 | Licensed to the Apache Software Foundation (ASF) under one
3 | or more contributor license agreements. See the NOTICE file
4 | distributed with this work for additional information
5 | regarding copyright ownership. The ASF licenses this file
6 | to you under the Apache License, Version 2.0 (the
7 | "License"); you may not use this file except in compliance
8 | with the License. You may obtain a copy of the License at
9 |
10 | https://www.apache.org/licenses/LICENSE-2.0
11 |
12 | Unless required by applicable law or agreed to in writing,
13 | software distributed under the License is distributed on an
14 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | KIND, either express or implied. See the License for the
16 | specific language governing permissions and limitations
17 | under the License.
18 | */
19 |
20 | import java.io.File;
21 | import java.io.FileInputStream;
22 | import java.io.FileOutputStream;
23 | import java.io.IOException;
24 | import java.net.URL;
25 | import java.nio.channels.Channels;
26 | import java.nio.channels.ReadableByteChannel;
27 | import java.util.Properties;
28 |
29 | public class MavenWrapperDownloader {
30 |
31 | /**
32 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
33 | */
34 | private static final String DEFAULT_DOWNLOAD_URL =
35 | "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
36 |
37 | /**
38 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
39 | * use instead of the default one.
40 | */
41 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
42 | ".mvn/wrapper/maven-wrapper.properties";
43 |
44 | /**
45 | * Path where the maven-wrapper.jar will be saved to.
46 | */
47 | private static final String MAVEN_WRAPPER_JAR_PATH =
48 | ".mvn/wrapper/maven-wrapper.jar";
49 |
50 | /**
51 | * Name of the property which should be used to override the default download url for the wrapper.
52 | */
53 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
54 |
55 | public static void main(String args[]) {
56 | System.out.println("- Downloader started");
57 | File baseDirectory = new File(args[0]);
58 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
59 |
60 | // If the maven-wrapper.properties exists, read it and check if it contains a custom
61 | // wrapperUrl parameter.
62 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
63 | String url = DEFAULT_DOWNLOAD_URL;
64 | if(mavenWrapperPropertyFile.exists()) {
65 | FileInputStream mavenWrapperPropertyFileInputStream = null;
66 | try {
67 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
68 | Properties mavenWrapperProperties = new Properties();
69 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
70 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
71 | } catch (IOException e) {
72 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
73 | } finally {
74 | try {
75 | if(mavenWrapperPropertyFileInputStream != null) {
76 | mavenWrapperPropertyFileInputStream.close();
77 | }
78 | } catch (IOException e) {
79 | // Ignore ...
80 | }
81 | }
82 | }
83 | System.out.println("- Downloading from: : " + url);
84 |
85 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
86 | if(!outputFile.getParentFile().exists()) {
87 | if(!outputFile.getParentFile().mkdirs()) {
88 | System.out.println(
89 | "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
90 | }
91 | }
92 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
93 | try {
94 | downloadFileFromURL(url, outputFile);
95 | System.out.println("Done");
96 | System.exit(0);
97 | } catch (Throwable e) {
98 | System.out.println("- Error downloading");
99 | e.printStackTrace();
100 | System.exit(1);
101 | }
102 | }
103 |
104 | private static void downloadFileFromURL(String urlString, File destination) throws Exception {
105 | URL website = new URL(urlString);
106 | ReadableByteChannel rbc;
107 | rbc = Channels.newChannel(website.openStream());
108 | FileOutputStream fos = new FileOutputStream(destination);
109 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
110 | fos.close();
111 | rbc.close();
112 | }
113 |
114 | }
115 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/Spring-Boot-Micro-Currency-Conversion-Service/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
2 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/Dockerfile:
--------------------------------------------------------------------------------
1 | # Start with a base image containing Java runtime
2 | FROM openjdk:11.0.3-jdk-stretch
3 |
4 | # Add Maintainer Info
5 | LABEL maintainer="anas.tayaagi@gmail.com"
6 |
7 | # Add a volume pointing to /tmp
8 | VOLUME /tmp
9 |
10 | # Make port 8099 available to the world outside this container
11 | EXPOSE 8099
12 |
13 | # The application's jar file
14 | ARG JAR_FILE=target/Spring-Boot-Micro-Currency-Conversion-Service-0.0.1-SNAPSHOT.jar
15 |
16 | # Add the application's jar to the container
17 | ADD ${JAR_FILE} /opt/currency-conversion-image.jar
18 |
19 | # Run the jar file
20 | ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/opt/currency-conversion-image.jar"]
21 |
22 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/currency-conversion-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: currency-conversion-service
5 | labels:
6 | app: currency-conversion-service
7 | spec:
8 | ports:
9 | - port: 8099
10 | name: http
11 | selector:
12 | app: currency-conversion-service
13 | ---
14 | apiVersion: extensions/v1beta1
15 | kind: Deployment
16 | metadata:
17 | name: currency-conversion-service-v1
18 | labels:
19 | version: v1
20 | spec:
21 | replicas: 1
22 | template:
23 | metadata:
24 | labels:
25 | app: currency-conversion-service
26 | version: v1
27 | spec:
28 | containers:
29 | - name: currency-conversion-service
30 | image: anastayaa/currency-conversion-image
31 | resources:
32 | requests:
33 | cpu: "100m"
34 | imagePullPolicy: IfNotPresent #Always
35 | ports:
36 | - containerPort: 8099
37 | ---
38 | apiVersion: extensions/v1beta1
39 | kind: Deployment
40 | metadata:
41 | name: currency-conversion-service-v2
42 | labels:
43 | version: v2
44 | spec:
45 | replicas: 1
46 | template:
47 | metadata:
48 | labels:
49 | app: currency-conversion-service
50 | version: v2
51 | spec:
52 | containers:
53 | - name: currency-conversion-service
54 | image: anastayaa/currency-conversion-image
55 | resources:
56 | requests:
57 | cpu: "100m"
58 | imagePullPolicy: IfNotPresent #Always
59 | ports:
60 | - containerPort: 8099
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/mvnw:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # ----------------------------------------------------------------------------
3 | # Licensed to the Apache Software Foundation (ASF) under one
4 | # or more contributor license agreements. See the NOTICE file
5 | # distributed with this work for additional information
6 | # regarding copyright ownership. The ASF licenses this file
7 | # to you under the Apache License, Version 2.0 (the
8 | # "License"); you may not use this file except in compliance
9 | # with the License. You may obtain a copy of the License at
10 | #
11 | # https://www.apache.org/licenses/LICENSE-2.0
12 | #
13 | # Unless required by applicable law or agreed to in writing,
14 | # software distributed under the License is distributed on an
15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 | # KIND, either express or implied. See the License for the
17 | # specific language governing permissions and limitations
18 | # under the License.
19 | # ----------------------------------------------------------------------------
20 |
21 | # ----------------------------------------------------------------------------
22 | # Maven2 Start Up Batch script
23 | #
24 | # Required ENV vars:
25 | # ------------------
26 | # JAVA_HOME - location of a JDK home dir
27 | #
28 | # Optional ENV vars
29 | # -----------------
30 | # M2_HOME - location of maven2's installed home dir
31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven
32 | # e.g. to debug Maven itself, use
33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35 | # ----------------------------------------------------------------------------
36 |
37 | if [ -z "$MAVEN_SKIP_RC" ] ; then
38 |
39 | if [ -f /etc/mavenrc ] ; then
40 | . /etc/mavenrc
41 | fi
42 |
43 | if [ -f "$HOME/.mavenrc" ] ; then
44 | . "$HOME/.mavenrc"
45 | fi
46 |
47 | fi
48 |
49 | # OS specific support. $var _must_ be set to either true or false.
50 | cygwin=false;
51 | darwin=false;
52 | mingw=false
53 | case "`uname`" in
54 | CYGWIN*) cygwin=true ;;
55 | MINGW*) mingw=true;;
56 | Darwin*) darwin=true
57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
59 | if [ -z "$JAVA_HOME" ]; then
60 | if [ -x "/usr/libexec/java_home" ]; then
61 | export JAVA_HOME="`/usr/libexec/java_home`"
62 | else
63 | export JAVA_HOME="/Library/Java/Home"
64 | fi
65 | fi
66 | ;;
67 | esac
68 |
69 | if [ -z "$JAVA_HOME" ] ; then
70 | if [ -r /etc/gentoo-release ] ; then
71 | JAVA_HOME=`java-config --jre-home`
72 | fi
73 | fi
74 |
75 | if [ -z "$M2_HOME" ] ; then
76 | ## resolve links - $0 may be a link to maven's home
77 | PRG="$0"
78 |
79 | # need this for relative symlinks
80 | while [ -h "$PRG" ] ; do
81 | ls=`ls -ld "$PRG"`
82 | link=`expr "$ls" : '.*-> \(.*\)$'`
83 | if expr "$link" : '/.*' > /dev/null; then
84 | PRG="$link"
85 | else
86 | PRG="`dirname "$PRG"`/$link"
87 | fi
88 | done
89 |
90 | saveddir=`pwd`
91 |
92 | M2_HOME=`dirname "$PRG"`/..
93 |
94 | # make it fully qualified
95 | M2_HOME=`cd "$M2_HOME" && pwd`
96 |
97 | cd "$saveddir"
98 | # echo Using m2 at $M2_HOME
99 | fi
100 |
101 | # For Cygwin, ensure paths are in UNIX format before anything is touched
102 | if $cygwin ; then
103 | [ -n "$M2_HOME" ] &&
104 | M2_HOME=`cygpath --unix "$M2_HOME"`
105 | [ -n "$JAVA_HOME" ] &&
106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
107 | [ -n "$CLASSPATH" ] &&
108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
109 | fi
110 |
111 | # For Mingw, ensure paths are in UNIX format before anything is touched
112 | if $mingw ; then
113 | [ -n "$M2_HOME" ] &&
114 | M2_HOME="`(cd "$M2_HOME"; pwd)`"
115 | [ -n "$JAVA_HOME" ] &&
116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
117 | # TODO classpath?
118 | fi
119 |
120 | if [ -z "$JAVA_HOME" ]; then
121 | javaExecutable="`which javac`"
122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
123 | # readlink(1) is not available as standard on Solaris 10.
124 | readLink=`which readlink`
125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
126 | if $darwin ; then
127 | javaHome="`dirname \"$javaExecutable\"`"
128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
129 | else
130 | javaExecutable="`readlink -f \"$javaExecutable\"`"
131 | fi
132 | javaHome="`dirname \"$javaExecutable\"`"
133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'`
134 | JAVA_HOME="$javaHome"
135 | export JAVA_HOME
136 | fi
137 | fi
138 | fi
139 |
140 | if [ -z "$JAVACMD" ] ; then
141 | if [ -n "$JAVA_HOME" ] ; then
142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
143 | # IBM's JDK on AIX uses strange locations for the executables
144 | JAVACMD="$JAVA_HOME/jre/sh/java"
145 | else
146 | JAVACMD="$JAVA_HOME/bin/java"
147 | fi
148 | else
149 | JAVACMD="`which java`"
150 | fi
151 | fi
152 |
153 | if [ ! -x "$JAVACMD" ] ; then
154 | echo "Error: JAVA_HOME is not defined correctly." >&2
155 | echo " We cannot execute $JAVACMD" >&2
156 | exit 1
157 | fi
158 |
159 | if [ -z "$JAVA_HOME" ] ; then
160 | echo "Warning: JAVA_HOME environment variable is not set."
161 | fi
162 |
163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
164 |
165 | # traverses directory structure from process work directory to filesystem root
166 | # first directory with .mvn subdirectory is considered project base directory
167 | find_maven_basedir() {
168 |
169 | if [ -z "$1" ]
170 | then
171 | echo "Path not specified to find_maven_basedir"
172 | return 1
173 | fi
174 |
175 | basedir="$1"
176 | wdir="$1"
177 | while [ "$wdir" != '/' ] ; do
178 | if [ -d "$wdir"/.mvn ] ; then
179 | basedir=$wdir
180 | break
181 | fi
182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc)
183 | if [ -d "${wdir}" ]; then
184 | wdir=`cd "$wdir/.."; pwd`
185 | fi
186 | # end of workaround
187 | done
188 | echo "${basedir}"
189 | }
190 |
191 | # concatenates all lines of a file
192 | concat_lines() {
193 | if [ -f "$1" ]; then
194 | echo "$(tr -s '\n' ' ' < "$1")"
195 | fi
196 | }
197 |
198 | BASE_DIR=`find_maven_basedir "$(pwd)"`
199 | if [ -z "$BASE_DIR" ]; then
200 | exit 1;
201 | fi
202 |
203 | ##########################################################################################
204 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
205 | # This allows using the maven wrapper in projects that prohibit checking in binary data.
206 | ##########################################################################################
207 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
208 | if [ "$MVNW_VERBOSE" = true ]; then
209 | echo "Found .mvn/wrapper/maven-wrapper.jar"
210 | fi
211 | else
212 | if [ "$MVNW_VERBOSE" = true ]; then
213 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
214 | fi
215 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
216 | while IFS="=" read key value; do
217 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
218 | esac
219 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
220 | if [ "$MVNW_VERBOSE" = true ]; then
221 | echo "Downloading from: $jarUrl"
222 | fi
223 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
224 |
225 | if command -v wget > /dev/null; then
226 | if [ "$MVNW_VERBOSE" = true ]; then
227 | echo "Found wget ... using wget"
228 | fi
229 | wget "$jarUrl" -O "$wrapperJarPath"
230 | elif command -v curl > /dev/null; then
231 | if [ "$MVNW_VERBOSE" = true ]; then
232 | echo "Found curl ... using curl"
233 | fi
234 | curl -o "$wrapperJarPath" "$jarUrl"
235 | else
236 | if [ "$MVNW_VERBOSE" = true ]; then
237 | echo "Falling back to using Java to download"
238 | fi
239 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
240 | if [ -e "$javaClass" ]; then
241 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
242 | if [ "$MVNW_VERBOSE" = true ]; then
243 | echo " - Compiling MavenWrapperDownloader.java ..."
244 | fi
245 | # Compiling the Java class
246 | ("$JAVA_HOME/bin/javac" "$javaClass")
247 | fi
248 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
249 | # Running the downloader
250 | if [ "$MVNW_VERBOSE" = true ]; then
251 | echo " - Running MavenWrapperDownloader.java ..."
252 | fi
253 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
254 | fi
255 | fi
256 | fi
257 | fi
258 | ##########################################################################################
259 | # End of extension
260 | ##########################################################################################
261 |
262 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
263 | if [ "$MVNW_VERBOSE" = true ]; then
264 | echo $MAVEN_PROJECTBASEDIR
265 | fi
266 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
267 |
268 | # For Cygwin, switch paths to Windows format before running java
269 | if $cygwin; then
270 | [ -n "$M2_HOME" ] &&
271 | M2_HOME=`cygpath --path --windows "$M2_HOME"`
272 | [ -n "$JAVA_HOME" ] &&
273 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
274 | [ -n "$CLASSPATH" ] &&
275 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
276 | [ -n "$MAVEN_PROJECTBASEDIR" ] &&
277 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
278 | fi
279 |
280 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
281 |
282 | exec "$JAVACMD" \
283 | $MAVEN_OPTS \
284 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
285 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
286 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
287 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/mvnw.cmd:
--------------------------------------------------------------------------------
1 | @REM ----------------------------------------------------------------------------
2 | @REM Licensed to the Apache Software Foundation (ASF) under one
3 | @REM or more contributor license agreements. See the NOTICE file
4 | @REM distributed with this work for additional information
5 | @REM regarding copyright ownership. The ASF licenses this file
6 | @REM to you under the Apache License, Version 2.0 (the
7 | @REM "License"); you may not use this file except in compliance
8 | @REM with the License. You may obtain a copy of the License at
9 | @REM
10 | @REM https://www.apache.org/licenses/LICENSE-2.0
11 | @REM
12 | @REM Unless required by applicable law or agreed to in writing,
13 | @REM software distributed under the License is distributed on an
14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | @REM KIND, either express or implied. See the License for the
16 | @REM specific language governing permissions and limitations
17 | @REM under the License.
18 | @REM ----------------------------------------------------------------------------
19 |
20 | @REM ----------------------------------------------------------------------------
21 | @REM Maven2 Start Up Batch script
22 | @REM
23 | @REM Required ENV vars:
24 | @REM JAVA_HOME - location of a JDK home dir
25 | @REM
26 | @REM Optional ENV vars
27 | @REM M2_HOME - location of maven2's installed home dir
28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 | @REM e.g. to debug Maven itself, use
32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34 | @REM ----------------------------------------------------------------------------
35 |
36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37 | @echo off
38 | @REM set title of command window
39 | title %0
40 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
42 |
43 | @REM set %HOME% to equivalent of $HOME
44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
45 |
46 | @REM Execute a user defined script before this one
47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending
49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
51 | :skipRcPre
52 |
53 | @setlocal
54 |
55 | set ERROR_CODE=0
56 |
57 | @REM To isolate internal variables from possible post scripts, we use another setlocal
58 | @setlocal
59 |
60 | @REM ==== START VALIDATION ====
61 | if not "%JAVA_HOME%" == "" goto OkJHome
62 |
63 | echo.
64 | echo Error: JAVA_HOME not found in your environment. >&2
65 | echo Please set the JAVA_HOME variable in your environment to match the >&2
66 | echo location of your Java installation. >&2
67 | echo.
68 | goto error
69 |
70 | :OkJHome
71 | if exist "%JAVA_HOME%\bin\java.exe" goto init
72 |
73 | echo.
74 | echo Error: JAVA_HOME is set to an invalid directory. >&2
75 | echo JAVA_HOME = "%JAVA_HOME%" >&2
76 | echo Please set the JAVA_HOME variable in your environment to match the >&2
77 | echo location of your Java installation. >&2
78 | echo.
79 | goto error
80 |
81 | @REM ==== END VALIDATION ====
82 |
83 | :init
84 |
85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86 | @REM Fallback to current working directory if not found.
87 |
88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90 |
91 | set EXEC_DIR=%CD%
92 | set WDIR=%EXEC_DIR%
93 | :findBaseDir
94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound
95 | cd ..
96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound
97 | set WDIR=%CD%
98 | goto findBaseDir
99 |
100 | :baseDirFound
101 | set MAVEN_PROJECTBASEDIR=%WDIR%
102 | cd "%EXEC_DIR%"
103 | goto endDetectBaseDir
104 |
105 | :baseDirNotFound
106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107 | cd "%EXEC_DIR%"
108 |
109 | :endDetectBaseDir
110 |
111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112 |
113 | @setlocal EnableExtensions EnableDelayedExpansion
114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116 |
117 | :endReadAdditionalConfig
118 |
119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
122 |
123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
124 | FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
125 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
126 | )
127 |
128 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
129 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data.
130 | if exist %WRAPPER_JAR% (
131 | echo Found %WRAPPER_JAR%
132 | ) else (
133 | echo Couldn't find %WRAPPER_JAR%, downloading it ...
134 | echo Downloading from: %DOWNLOAD_URL%
135 | powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
136 | echo Finished downloading %WRAPPER_JAR%
137 | )
138 | @REM End of extension
139 |
140 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
141 | if ERRORLEVEL 1 goto error
142 | goto end
143 |
144 | :error
145 | set ERROR_CODE=1
146 |
147 | :end
148 | @endlocal & set ERROR_CODE=%ERROR_CODE%
149 |
150 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
151 | @REM check for post script, once with legacy .bat ending and once with .cmd ending
152 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
153 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
154 | :skipRcPost
155 |
156 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
157 | if "%MAVEN_BATCH_PAUSE%" == "on" pause
158 |
159 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
160 |
161 | exit /B %ERROR_CODE%
162 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.1.6.RELEASE
9 |
10 |
11 | com.example.currencyconversion
12 | Spring-Boot-Micro-Currency-Conversion-Service
13 | 0.0.1-SNAPSHOT
14 | Spring-Boot-Micro-Currency-Conversion-Service
15 | Demo project for Spring Boot
16 |
17 |
18 | 1.8
19 | Greenwich.SR2
20 |
21 |
22 |
23 |
24 | org.springframework.boot
25 | spring-boot-starter-web
26 |
27 |
28 | org.springframework.cloud
29 | spring-cloud-starter-openfeign
30 |
31 |
32 |
33 | org.springframework.boot
34 | spring-boot-devtools
35 | runtime
36 | true
37 |
38 |
39 | org.springframework.boot
40 | spring-boot-starter-test
41 | test
42 |
43 |
44 | org.springframework.cloud
45 | spring-cloud-starter-netflix-ribbon
46 |
47 |
48 |
49 |
50 |
51 |
52 | org.springframework.cloud
53 | spring-cloud-dependencies
54 | ${spring-cloud.version}
55 | pom
56 | import
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | org.springframework.boot
65 | spring-boot-maven-plugin
66 |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/src/main/java/com/example/currencyconversion/SpringBootMicroCurrencyConversionServiceApplication.java:
--------------------------------------------------------------------------------
1 | package com.example.currencyconversion;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
6 | import org.springframework.cloud.openfeign.EnableFeignClients;
7 |
8 | @SpringBootApplication
9 | @EnableFeignClients("com.example.currencyconversion.proxy")
10 | @EnableDiscoveryClient
11 | public class SpringBootMicroCurrencyConversionServiceApplication {
12 |
13 | public static void main(String[] args) {
14 | SpringApplication.run(SpringBootMicroCurrencyConversionServiceApplication.class, args);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/src/main/java/com/example/currencyconversion/controller/CurrencyConversionController.java:
--------------------------------------------------------------------------------
1 | package com.example.currencyconversion.controller;
2 |
3 | import com.example.currencyconversion.model.CurrencyConversionBean;
4 | import com.example.currencyconversion.proxy.CurrencyExchangeServiceProxy;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.web.bind.annotation.GetMapping;
7 | import org.springframework.web.bind.annotation.PathVariable;
8 | import org.springframework.web.bind.annotation.RestController;
9 |
10 | import java.math.BigDecimal;
11 |
12 | @RestController
13 | public class CurrencyConversionController {
14 |
15 | //private Logger logger = LoggerFactory.getLogger(this.getClass());
16 |
17 | @Autowired
18 | private CurrencyExchangeServiceProxy proxy;
19 |
20 | @GetMapping("/currency-converter/from/{from}/to/{to}/quantity/{quantity}")
21 | public CurrencyConversionBean convertCurrency(@PathVariable String from, @PathVariable String to,
22 | @PathVariable BigDecimal quantity) {
23 |
24 | CurrencyConversionBean response = proxy.retrieveExchangeValue(from, to);
25 | return new CurrencyConversionBean(response.getId(), from, to, response.getConversionMultiple(), quantity,
26 | quantity.multiply(response.getConversionMultiple()), response.getPort());
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/src/main/java/com/example/currencyconversion/model/CurrencyConversionBean.java:
--------------------------------------------------------------------------------
1 | package com.example.currencyconversion.model;
2 |
3 | import java.math.BigDecimal;
4 |
5 | public class CurrencyConversionBean {
6 | private Long id;
7 | private String from;
8 | private String to;
9 | private BigDecimal conversionMultiple;
10 | private BigDecimal quantity;
11 | private BigDecimal totalCalculatedAmount;
12 | private int port;
13 |
14 | public CurrencyConversionBean() {
15 |
16 | }
17 |
18 | public CurrencyConversionBean(Long id, String from, String to, BigDecimal conversionMultiple, BigDecimal quantity,
19 | BigDecimal totalCalculatedAmount, int port) {
20 | super();
21 | this.id = id;
22 | this.from = from;
23 | this.to = to;
24 | this.conversionMultiple = conversionMultiple;
25 | this.quantity = quantity;
26 | this.totalCalculatedAmount = totalCalculatedAmount;
27 | this.port = port;
28 | }
29 |
30 | public Long getId() {
31 | return id;
32 | }
33 |
34 | public void setId(Long id) {
35 | this.id = id;
36 | }
37 |
38 | public String getFrom() {
39 | return from;
40 | }
41 |
42 | public void setFrom(String from) {
43 | this.from = from;
44 | }
45 |
46 | public String getTo() {
47 | return to;
48 | }
49 |
50 | public void setTo(String to) {
51 | this.to = to;
52 | }
53 |
54 | public BigDecimal getConversionMultiple() {
55 | return conversionMultiple;
56 | }
57 |
58 | public void setConversionMultiple(BigDecimal conversionMultiple) {
59 | this.conversionMultiple = conversionMultiple;
60 | }
61 |
62 | public BigDecimal getQuantity() {
63 | return quantity;
64 | }
65 |
66 | public void setQuantity(BigDecimal quantity) {
67 | this.quantity = quantity;
68 | }
69 |
70 | public BigDecimal getTotalCalculatedAmount() {
71 | return totalCalculatedAmount;
72 | }
73 |
74 | public void setTotalCalculatedAmount(BigDecimal totalCalculatedAmount) {
75 | this.totalCalculatedAmount = totalCalculatedAmount;
76 | }
77 |
78 | public int getPort() {
79 | return port;
80 | }
81 |
82 | public void setPort(int port) {
83 | this.port = port;
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/src/main/java/com/example/currencyconversion/proxy/CurrencyExchangeServiceProxy.java:
--------------------------------------------------------------------------------
1 | package com.example.currencyconversion.proxy;
2 |
3 | import com.example.currencyconversion.model.CurrencyConversionBean;
4 | import org.springframework.cloud.netflix.ribbon.RibbonClient;
5 | import org.springframework.cloud.openfeign.FeignClient;
6 | import org.springframework.web.bind.annotation.GetMapping;
7 | import org.springframework.web.bind.annotation.PathVariable;
8 |
9 | @FeignClient(name="forex-service")
10 | @RibbonClient(name="forex-service")
11 | public interface CurrencyExchangeServiceProxy {
12 |
13 | @GetMapping("/currency-exchange/from/{from}/to/{to}")
14 | CurrencyConversionBean retrieveExchangeValue
15 | (@PathVariable("from") String from, @PathVariable("to") String to);
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.application.name=currency-conversion-service
2 | server.port=8099
3 | forex-service.ribbon.listOfServers=localhost:8000
4 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Currency-Conversion-Service/src/test/java/com/example/currencyconversion/SpringBootMicroCurrencyConversionService/SpringBootMicroCurrencyConversionServiceApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.example.currencyconversion.SpringBootMicroCurrencyConversionService;
2 |
3 | import org.junit.Test;
4 | import org.junit.runner.RunWith;
5 | import org.springframework.boot.test.context.SpringBootTest;
6 | import org.springframework.test.context.junit4.SpringRunner;
7 |
8 | @RunWith(SpringRunner.class)
9 | @SpringBootTest
10 | public class SpringBootMicroCurrencyConversionServiceApplicationTests {
11 |
12 | @Test
13 | public void contextLoads() {
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**
5 | !**/src/test/**
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 |
30 | ### VS Code ###
31 | .vscode/
32 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/.mvn/wrapper/MavenWrapperDownloader.java:
--------------------------------------------------------------------------------
1 | /*
2 | Licensed to the Apache Software Foundation (ASF) under one
3 | or more contributor license agreements. See the NOTICE file
4 | distributed with this work for additional information
5 | regarding copyright ownership. The ASF licenses this file
6 | to you under the Apache License, Version 2.0 (the
7 | "License"); you may not use this file except in compliance
8 | with the License. You may obtain a copy of the License at
9 |
10 | https://www.apache.org/licenses/LICENSE-2.0
11 |
12 | Unless required by applicable law or agreed to in writing,
13 | software distributed under the License is distributed on an
14 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | KIND, either express or implied. See the License for the
16 | specific language governing permissions and limitations
17 | under the License.
18 | */
19 |
20 | import java.io.File;
21 | import java.io.FileInputStream;
22 | import java.io.FileOutputStream;
23 | import java.io.IOException;
24 | import java.net.URL;
25 | import java.nio.channels.Channels;
26 | import java.nio.channels.ReadableByteChannel;
27 | import java.util.Properties;
28 |
29 | public class MavenWrapperDownloader {
30 |
31 | /**
32 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
33 | */
34 | private static final String DEFAULT_DOWNLOAD_URL =
35 | "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
36 |
37 | /**
38 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
39 | * use instead of the default one.
40 | */
41 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
42 | ".mvn/wrapper/maven-wrapper.properties";
43 |
44 | /**
45 | * Path where the maven-wrapper.jar will be saved to.
46 | */
47 | private static final String MAVEN_WRAPPER_JAR_PATH =
48 | ".mvn/wrapper/maven-wrapper.jar";
49 |
50 | /**
51 | * Name of the property which should be used to override the default download url for the wrapper.
52 | */
53 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
54 |
55 | public static void main(String args[]) {
56 | System.out.println("- Downloader started");
57 | File baseDirectory = new File(args[0]);
58 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
59 |
60 | // If the maven-wrapper.properties exists, read it and check if it contains a custom
61 | // wrapperUrl parameter.
62 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
63 | String url = DEFAULT_DOWNLOAD_URL;
64 | if(mavenWrapperPropertyFile.exists()) {
65 | FileInputStream mavenWrapperPropertyFileInputStream = null;
66 | try {
67 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
68 | Properties mavenWrapperProperties = new Properties();
69 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
70 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
71 | } catch (IOException e) {
72 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
73 | } finally {
74 | try {
75 | if(mavenWrapperPropertyFileInputStream != null) {
76 | mavenWrapperPropertyFileInputStream.close();
77 | }
78 | } catch (IOException e) {
79 | // Ignore ...
80 | }
81 | }
82 | }
83 | System.out.println("- Downloading from: : " + url);
84 |
85 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
86 | if(!outputFile.getParentFile().exists()) {
87 | if(!outputFile.getParentFile().mkdirs()) {
88 | System.out.println(
89 | "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
90 | }
91 | }
92 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
93 | try {
94 | downloadFileFromURL(url, outputFile);
95 | System.out.println("Done");
96 | System.exit(0);
97 | } catch (Throwable e) {
98 | System.out.println("- Error downloading");
99 | e.printStackTrace();
100 | System.exit(1);
101 | }
102 | }
103 |
104 | private static void downloadFileFromURL(String urlString, File destination) throws Exception {
105 | URL website = new URL(urlString);
106 | ReadableByteChannel rbc;
107 | rbc = Channels.newChannel(website.openStream());
108 | FileOutputStream fos = new FileOutputStream(destination);
109 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
110 | fos.close();
111 | rbc.close();
112 | }
113 |
114 | }
115 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/Spring-Boot-Micro-Forex-Service/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
2 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/Dockerfile:
--------------------------------------------------------------------------------
1 | # Start with a base image containing Java runtime
2 | FROM openjdk:11.0.3-jdk-stretch
3 |
4 | # Add Maintainer Info
5 | LABEL maintainer="anas.tayaagi@gmail.com"
6 |
7 | # Add a volume pointing to /tmp
8 | VOLUME /tmp
9 |
10 | # Make port 8080 available to the world outside this container
11 | EXPOSE 8098
12 |
13 | # The application's jar file
14 | ARG JAR_FILE=target/Spring-Boot-Micro-Forex-Service-0.0.1-SNAPSHOT.jar
15 |
16 | # Add the application's jar to the container
17 | ADD ${JAR_FILE} /opt/forex-image.jar
18 |
19 | # Run the jar file
20 | ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/opt/forex-image.jar"]
21 |
22 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/forex-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: forex-service
5 | labels:
6 | app: forex-service
7 | spec:
8 | ports:
9 | - port: 8098
10 | name: http
11 | selector:
12 | app: forex-service
13 | ---
14 | apiVersion: extensions/v1beta1
15 | kind: Deployment
16 | metadata:
17 | name: forex-service-v1
18 | labels:
19 | version: v1
20 | spec:
21 | replicas: 1
22 | template:
23 | metadata:
24 | labels:
25 | app: forex-service
26 | version: v1
27 | spec:
28 | containers:
29 | - name: forex-service
30 | image: anastayaa/forex-image
31 | resources:
32 | requests:
33 | cpu: "100m"
34 | imagePullPolicy: IfNotPresent #Always
35 | ports:
36 | - containerPort: 8098
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/mvnw:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # ----------------------------------------------------------------------------
3 | # Licensed to the Apache Software Foundation (ASF) under one
4 | # or more contributor license agreements. See the NOTICE file
5 | # distributed with this work for additional information
6 | # regarding copyright ownership. The ASF licenses this file
7 | # to you under the Apache License, Version 2.0 (the
8 | # "License"); you may not use this file except in compliance
9 | # with the License. You may obtain a copy of the License at
10 | #
11 | # https://www.apache.org/licenses/LICENSE-2.0
12 | #
13 | # Unless required by applicable law or agreed to in writing,
14 | # software distributed under the License is distributed on an
15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 | # KIND, either express or implied. See the License for the
17 | # specific language governing permissions and limitations
18 | # under the License.
19 | # ----------------------------------------------------------------------------
20 |
21 | # ----------------------------------------------------------------------------
22 | # Maven2 Start Up Batch script
23 | #
24 | # Required ENV vars:
25 | # ------------------
26 | # JAVA_HOME - location of a JDK home dir
27 | #
28 | # Optional ENV vars
29 | # -----------------
30 | # M2_HOME - location of maven2's installed home dir
31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven
32 | # e.g. to debug Maven itself, use
33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35 | # ----------------------------------------------------------------------------
36 |
37 | if [ -z "$MAVEN_SKIP_RC" ] ; then
38 |
39 | if [ -f /etc/mavenrc ] ; then
40 | . /etc/mavenrc
41 | fi
42 |
43 | if [ -f "$HOME/.mavenrc" ] ; then
44 | . "$HOME/.mavenrc"
45 | fi
46 |
47 | fi
48 |
49 | # OS specific support. $var _must_ be set to either true or false.
50 | cygwin=false;
51 | darwin=false;
52 | mingw=false
53 | case "`uname`" in
54 | CYGWIN*) cygwin=true ;;
55 | MINGW*) mingw=true;;
56 | Darwin*) darwin=true
57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
59 | if [ -z "$JAVA_HOME" ]; then
60 | if [ -x "/usr/libexec/java_home" ]; then
61 | export JAVA_HOME="`/usr/libexec/java_home`"
62 | else
63 | export JAVA_HOME="/Library/Java/Home"
64 | fi
65 | fi
66 | ;;
67 | esac
68 |
69 | if [ -z "$JAVA_HOME" ] ; then
70 | if [ -r /etc/gentoo-release ] ; then
71 | JAVA_HOME=`java-config --jre-home`
72 | fi
73 | fi
74 |
75 | if [ -z "$M2_HOME" ] ; then
76 | ## resolve links - $0 may be a link to maven's home
77 | PRG="$0"
78 |
79 | # need this for relative symlinks
80 | while [ -h "$PRG" ] ; do
81 | ls=`ls -ld "$PRG"`
82 | link=`expr "$ls" : '.*-> \(.*\)$'`
83 | if expr "$link" : '/.*' > /dev/null; then
84 | PRG="$link"
85 | else
86 | PRG="`dirname "$PRG"`/$link"
87 | fi
88 | done
89 |
90 | saveddir=`pwd`
91 |
92 | M2_HOME=`dirname "$PRG"`/..
93 |
94 | # make it fully qualified
95 | M2_HOME=`cd "$M2_HOME" && pwd`
96 |
97 | cd "$saveddir"
98 | # echo Using m2 at $M2_HOME
99 | fi
100 |
101 | # For Cygwin, ensure paths are in UNIX format before anything is touched
102 | if $cygwin ; then
103 | [ -n "$M2_HOME" ] &&
104 | M2_HOME=`cygpath --unix "$M2_HOME"`
105 | [ -n "$JAVA_HOME" ] &&
106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
107 | [ -n "$CLASSPATH" ] &&
108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
109 | fi
110 |
111 | # For Mingw, ensure paths are in UNIX format before anything is touched
112 | if $mingw ; then
113 | [ -n "$M2_HOME" ] &&
114 | M2_HOME="`(cd "$M2_HOME"; pwd)`"
115 | [ -n "$JAVA_HOME" ] &&
116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
117 | # TODO classpath?
118 | fi
119 |
120 | if [ -z "$JAVA_HOME" ]; then
121 | javaExecutable="`which javac`"
122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
123 | # readlink(1) is not available as standard on Solaris 10.
124 | readLink=`which readlink`
125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
126 | if $darwin ; then
127 | javaHome="`dirname \"$javaExecutable\"`"
128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
129 | else
130 | javaExecutable="`readlink -f \"$javaExecutable\"`"
131 | fi
132 | javaHome="`dirname \"$javaExecutable\"`"
133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'`
134 | JAVA_HOME="$javaHome"
135 | export JAVA_HOME
136 | fi
137 | fi
138 | fi
139 |
140 | if [ -z "$JAVACMD" ] ; then
141 | if [ -n "$JAVA_HOME" ] ; then
142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
143 | # IBM's JDK on AIX uses strange locations for the executables
144 | JAVACMD="$JAVA_HOME/jre/sh/java"
145 | else
146 | JAVACMD="$JAVA_HOME/bin/java"
147 | fi
148 | else
149 | JAVACMD="`which java`"
150 | fi
151 | fi
152 |
153 | if [ ! -x "$JAVACMD" ] ; then
154 | echo "Error: JAVA_HOME is not defined correctly." >&2
155 | echo " We cannot execute $JAVACMD" >&2
156 | exit 1
157 | fi
158 |
159 | if [ -z "$JAVA_HOME" ] ; then
160 | echo "Warning: JAVA_HOME environment variable is not set."
161 | fi
162 |
163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
164 |
165 | # traverses directory structure from process work directory to filesystem root
166 | # first directory with .mvn subdirectory is considered project base directory
167 | find_maven_basedir() {
168 |
169 | if [ -z "$1" ]
170 | then
171 | echo "Path not specified to find_maven_basedir"
172 | return 1
173 | fi
174 |
175 | basedir="$1"
176 | wdir="$1"
177 | while [ "$wdir" != '/' ] ; do
178 | if [ -d "$wdir"/.mvn ] ; then
179 | basedir=$wdir
180 | break
181 | fi
182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc)
183 | if [ -d "${wdir}" ]; then
184 | wdir=`cd "$wdir/.."; pwd`
185 | fi
186 | # end of workaround
187 | done
188 | echo "${basedir}"
189 | }
190 |
191 | # concatenates all lines of a file
192 | concat_lines() {
193 | if [ -f "$1" ]; then
194 | echo "$(tr -s '\n' ' ' < "$1")"
195 | fi
196 | }
197 |
198 | BASE_DIR=`find_maven_basedir "$(pwd)"`
199 | if [ -z "$BASE_DIR" ]; then
200 | exit 1;
201 | fi
202 |
203 | ##########################################################################################
204 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
205 | # This allows using the maven wrapper in projects that prohibit checking in binary data.
206 | ##########################################################################################
207 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
208 | if [ "$MVNW_VERBOSE" = true ]; then
209 | echo "Found .mvn/wrapper/maven-wrapper.jar"
210 | fi
211 | else
212 | if [ "$MVNW_VERBOSE" = true ]; then
213 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
214 | fi
215 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
216 | while IFS="=" read key value; do
217 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
218 | esac
219 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
220 | if [ "$MVNW_VERBOSE" = true ]; then
221 | echo "Downloading from: $jarUrl"
222 | fi
223 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
224 |
225 | if command -v wget > /dev/null; then
226 | if [ "$MVNW_VERBOSE" = true ]; then
227 | echo "Found wget ... using wget"
228 | fi
229 | wget "$jarUrl" -O "$wrapperJarPath"
230 | elif command -v curl > /dev/null; then
231 | if [ "$MVNW_VERBOSE" = true ]; then
232 | echo "Found curl ... using curl"
233 | fi
234 | curl -o "$wrapperJarPath" "$jarUrl"
235 | else
236 | if [ "$MVNW_VERBOSE" = true ]; then
237 | echo "Falling back to using Java to download"
238 | fi
239 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
240 | if [ -e "$javaClass" ]; then
241 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
242 | if [ "$MVNW_VERBOSE" = true ]; then
243 | echo " - Compiling MavenWrapperDownloader.java ..."
244 | fi
245 | # Compiling the Java class
246 | ("$JAVA_HOME/bin/javac" "$javaClass")
247 | fi
248 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
249 | # Running the downloader
250 | if [ "$MVNW_VERBOSE" = true ]; then
251 | echo " - Running MavenWrapperDownloader.java ..."
252 | fi
253 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
254 | fi
255 | fi
256 | fi
257 | fi
258 | ##########################################################################################
259 | # End of extension
260 | ##########################################################################################
261 |
262 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
263 | if [ "$MVNW_VERBOSE" = true ]; then
264 | echo $MAVEN_PROJECTBASEDIR
265 | fi
266 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
267 |
268 | # For Cygwin, switch paths to Windows format before running java
269 | if $cygwin; then
270 | [ -n "$M2_HOME" ] &&
271 | M2_HOME=`cygpath --path --windows "$M2_HOME"`
272 | [ -n "$JAVA_HOME" ] &&
273 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
274 | [ -n "$CLASSPATH" ] &&
275 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
276 | [ -n "$MAVEN_PROJECTBASEDIR" ] &&
277 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
278 | fi
279 |
280 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
281 |
282 | exec "$JAVACMD" \
283 | $MAVEN_OPTS \
284 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
285 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
286 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
287 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/mvnw.cmd:
--------------------------------------------------------------------------------
1 | @REM ----------------------------------------------------------------------------
2 | @REM Licensed to the Apache Software Foundation (ASF) under one
3 | @REM or more contributor license agreements. See the NOTICE file
4 | @REM distributed with this work for additional information
5 | @REM regarding copyright ownership. The ASF licenses this file
6 | @REM to you under the Apache License, Version 2.0 (the
7 | @REM "License"); you may not use this file except in compliance
8 | @REM with the License. You may obtain a copy of the License at
9 | @REM
10 | @REM https://www.apache.org/licenses/LICENSE-2.0
11 | @REM
12 | @REM Unless required by applicable law or agreed to in writing,
13 | @REM software distributed under the License is distributed on an
14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | @REM KIND, either express or implied. See the License for the
16 | @REM specific language governing permissions and limitations
17 | @REM under the License.
18 | @REM ----------------------------------------------------------------------------
19 |
20 | @REM ----------------------------------------------------------------------------
21 | @REM Maven2 Start Up Batch script
22 | @REM
23 | @REM Required ENV vars:
24 | @REM JAVA_HOME - location of a JDK home dir
25 | @REM
26 | @REM Optional ENV vars
27 | @REM M2_HOME - location of maven2's installed home dir
28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 | @REM e.g. to debug Maven itself, use
32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34 | @REM ----------------------------------------------------------------------------
35 |
36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37 | @echo off
38 | @REM set title of command window
39 | title %0
40 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
42 |
43 | @REM set %HOME% to equivalent of $HOME
44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
45 |
46 | @REM Execute a user defined script before this one
47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending
49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
51 | :skipRcPre
52 |
53 | @setlocal
54 |
55 | set ERROR_CODE=0
56 |
57 | @REM To isolate internal variables from possible post scripts, we use another setlocal
58 | @setlocal
59 |
60 | @REM ==== START VALIDATION ====
61 | if not "%JAVA_HOME%" == "" goto OkJHome
62 |
63 | echo.
64 | echo Error: JAVA_HOME not found in your environment. >&2
65 | echo Please set the JAVA_HOME variable in your environment to match the >&2
66 | echo location of your Java installation. >&2
67 | echo.
68 | goto error
69 |
70 | :OkJHome
71 | if exist "%JAVA_HOME%\bin\java.exe" goto init
72 |
73 | echo.
74 | echo Error: JAVA_HOME is set to an invalid directory. >&2
75 | echo JAVA_HOME = "%JAVA_HOME%" >&2
76 | echo Please set the JAVA_HOME variable in your environment to match the >&2
77 | echo location of your Java installation. >&2
78 | echo.
79 | goto error
80 |
81 | @REM ==== END VALIDATION ====
82 |
83 | :init
84 |
85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86 | @REM Fallback to current working directory if not found.
87 |
88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90 |
91 | set EXEC_DIR=%CD%
92 | set WDIR=%EXEC_DIR%
93 | :findBaseDir
94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound
95 | cd ..
96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound
97 | set WDIR=%CD%
98 | goto findBaseDir
99 |
100 | :baseDirFound
101 | set MAVEN_PROJECTBASEDIR=%WDIR%
102 | cd "%EXEC_DIR%"
103 | goto endDetectBaseDir
104 |
105 | :baseDirNotFound
106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107 | cd "%EXEC_DIR%"
108 |
109 | :endDetectBaseDir
110 |
111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112 |
113 | @setlocal EnableExtensions EnableDelayedExpansion
114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116 |
117 | :endReadAdditionalConfig
118 |
119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
122 |
123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
124 | FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
125 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
126 | )
127 |
128 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
129 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data.
130 | if exist %WRAPPER_JAR% (
131 | echo Found %WRAPPER_JAR%
132 | ) else (
133 | echo Couldn't find %WRAPPER_JAR%, downloading it ...
134 | echo Downloading from: %DOWNLOAD_URL%
135 | powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
136 | echo Finished downloading %WRAPPER_JAR%
137 | )
138 | @REM End of extension
139 |
140 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
141 | if ERRORLEVEL 1 goto error
142 | goto end
143 |
144 | :error
145 | set ERROR_CODE=1
146 |
147 | :end
148 | @endlocal & set ERROR_CODE=%ERROR_CODE%
149 |
150 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
151 | @REM check for post script, once with legacy .bat ending and once with .cmd ending
152 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
153 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
154 | :skipRcPost
155 |
156 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
157 | if "%MAVEN_BATCH_PAUSE%" == "on" pause
158 |
159 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
160 |
161 | exit /B %ERROR_CODE%
162 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.1.6.RELEASE
9 |
10 |
11 | com.example.forex
12 | Spring-Boot-Micro-Forex-Service
13 | 0.0.1-SNAPSHOT
14 | jar
15 | Spring-Boot-Micro-Forex-Service
16 | Demo project for Spring Boot
17 |
18 |
19 | 1.8
20 |
21 |
22 |
23 |
24 | org.springframework.boot
25 | spring-boot-starter-data-jpa
26 |
27 |
28 | org.springframework.boot
29 | spring-boot-starter-web
30 |
31 |
32 |
33 | org.springframework.boot
34 | spring-boot-devtools
35 | runtime
36 |
37 |
38 | com.h2database
39 | h2
40 | runtime
41 |
42 |
43 | org.springframework.boot
44 | spring-boot-starter-test
45 | test
46 |
47 |
48 | org.springframework.cloud
49 | spring-cloud-starter-config
50 | 2.1.3.RELEASE
51 |
52 |
53 |
54 |
65 |
66 |
67 |
68 |
69 | org.springframework.boot
70 | spring-boot-maven-plugin
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/src/main/java/com/example/forex/SpringBootMicroForexServiceApplication.java:
--------------------------------------------------------------------------------
1 | package com.example.forex;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
6 |
7 | @SpringBootApplication
8 | @EnableDiscoveryClient
9 | public class SpringBootMicroForexServiceApplication {
10 |
11 | public static void main(String[] args) {
12 | SpringApplication.run(SpringBootMicroForexServiceApplication.class, args);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/src/main/java/com/example/forex/controller/ForexController.java:
--------------------------------------------------------------------------------
1 | package com.example.forex.controller;
2 |
3 | import com.example.forex.dao.ExchangeValueRepository;
4 | import com.example.forex.model.ExchangeValue;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.core.env.Environment;
7 | import org.springframework.web.bind.annotation.GetMapping;
8 | import org.springframework.web.bind.annotation.PathVariable;
9 | import org.springframework.web.bind.annotation.RestController;
10 |
11 | @RestController
12 | public class ForexController {
13 |
14 | @Autowired
15 | private Environment environment;
16 |
17 | @Autowired
18 | private ExchangeValueRepository repository;
19 |
20 | @GetMapping("/currency-exchange/from/{from}/to/{to}")
21 | public ExchangeValue retrieveExchangeValue
22 | (@PathVariable String from, @PathVariable String to){
23 |
24 | ExchangeValue exchangeValue =
25 | repository.findByFromAndTo(from, to);
26 |
27 | exchangeValue.setPort(
28 | Integer.parseInt(environment.getProperty("local.server.port")));
29 |
30 | return exchangeValue;
31 | }
32 |
33 | }
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/src/main/java/com/example/forex/dao/ExchangeValueRepository.java:
--------------------------------------------------------------------------------
1 | package com.example.forex.dao;
2 |
3 | import com.example.forex.model.ExchangeValue;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 |
6 | public interface ExchangeValueRepository extends
7 | JpaRepository {
8 |
9 | ExchangeValue findByFromAndTo(String from, String to);
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/src/main/java/com/example/forex/model/ExchangeValue.java:
--------------------------------------------------------------------------------
1 | package com.example.forex.model;
2 |
3 | import javax.persistence.Column;
4 | import javax.persistence.Entity;
5 | import javax.persistence.Id;
6 | import java.math.BigDecimal;
7 |
8 | @Entity
9 | public class ExchangeValue {
10 |
11 | @Id
12 | private Long id;
13 |
14 | @Column(name="currency_from")
15 | private String from;
16 |
17 | @Column(name="currency_to")
18 | private String to;
19 |
20 | private BigDecimal conversionMultiple;
21 | private int port;
22 |
23 | public ExchangeValue() {
24 |
25 | }
26 |
27 | public ExchangeValue(Long id, String from, String to, BigDecimal conversionMultiple) {
28 | super();
29 | this.id = id;
30 | this.from = from;
31 | this.to = to;
32 | this.conversionMultiple = conversionMultiple;
33 | }
34 |
35 | public Long getId() {
36 | return id;
37 | }
38 |
39 | public String getFrom() {
40 | return from;
41 | }
42 |
43 | public String getTo() {
44 | return to;
45 | }
46 |
47 | public BigDecimal getConversionMultiple() {
48 | return conversionMultiple;
49 | }
50 |
51 | public int getPort() {
52 | return port;
53 | }
54 |
55 | public void setPort(int port) {
56 | this.port = port;
57 | }
58 |
59 | }
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.application.name=forex-service
2 | server.port=8098
3 | spring.datasource.url=jdbc:h2:mem:testdb
4 | spring.datasource.driverClassName=org.h2.Driver
5 | spring.datasource.username=sa
6 | spring.datasource.password=password
7 | spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
8 | spring.jpa.show-sql=true
9 | spring.h2.console.enabled=true
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/src/main/resources/data.sql:
--------------------------------------------------------------------------------
1 | drop table if exists exchange_value;
2 | create table exchange_value(
3 | id INT AUTO_INCREMENT PRIMARY KEY,
4 | currency_from VARCHAR(25),
5 | currency_to VARCHAR(25),
6 | conversion_multiple DECIMAL,
7 | port INT
8 | );
9 | insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)
10 | values(10001,'USD','INR',65,0);
11 | insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)
12 | values(10002,'EUR','INR',75,0);
13 | insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)
14 | values(10003,'AUD','INR',25,0);
--------------------------------------------------------------------------------
/Spring-Boot-Micro-Forex-Service/src/test/java/com/example/forex/SpringBootMicroForexService/SpringBootMicroForexServiceApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.example.forex.SpringBootMicroForexService;
2 |
3 | import org.junit.Test;
4 | import org.junit.runner.RunWith;
5 | import org.springframework.boot.test.context.SpringBootTest;
6 | import org.springframework.test.context.junit4.SpringRunner;
7 |
8 | @RunWith(SpringRunner.class)
9 | @SpringBootTest
10 | public class SpringBootMicroForexServiceApplicationTests {
11 |
12 | @Test
13 | public void contextLoads() {
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/screens/analyticsPlugin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/analyticsPlugin.png
--------------------------------------------------------------------------------
/screens/apiGateway.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/apiGateway.png
--------------------------------------------------------------------------------
/screens/authentication.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/authentication.png
--------------------------------------------------------------------------------
/screens/clientToServiceCommunication.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/clientToServiceCommunication.png
--------------------------------------------------------------------------------
/screens/communityvsentreprise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/communityvsentreprise.png
--------------------------------------------------------------------------------
/screens/docker-containers-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/docker-containers-1.png
--------------------------------------------------------------------------------
/screens/gateway-stack-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/gateway-stack-2.png
--------------------------------------------------------------------------------
/screens/kong-conclusion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/kong-conclusion.png
--------------------------------------------------------------------------------
/screens/kong.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/kong.png
--------------------------------------------------------------------------------
/screens/konga-connection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/konga-connection.png
--------------------------------------------------------------------------------
/screens/securityPlugin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/securityPlugin.png
--------------------------------------------------------------------------------
/screens/serverlessPlugin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/serverlessPlugin.png
--------------------------------------------------------------------------------
/screens/test:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/screens/traficControlPlugin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/traficControlPlugin.png
--------------------------------------------------------------------------------