morganjbruce / microservices-in-action Goto Github PK
View Code? Open in Web Editor NEWExamples and code for Microservices In Action
License: MIT License
Examples and code for Microservices In Action
License: MIT License
Building the docker-compose in chapter 12 results in pulling latest images error for either the elasticsearch and the kibana images. You have to be explicit on the version number for both of them. As of today, it works for elasticsearch:5.6, kibana:5.5.2
Step 1/2 : FROM fluent/fluentd:v0.12-debian
---> 3bcd4366c0e6
Step 2/2 : RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.2"]
---> Running in ea0ede6e3a68
ERROR: Error installing fluent-plugin-elasticsearch:
faraday requires Ruby version >= 2.4.
Successfully installed multi_json-1.15.0
Successfully installed elasticsearch-api-1.0.18
Successfully installed multipart-post-2.1.1
Successfully installed ruby2_keywords-0.0.2
ERROR: Service 'fluentd' failed to build : The command 'gem install fluent-plugin-elasticsearch --no-rdoc --no-ri --version 1.9.2' returned a non-zero code: 1
On docker-compose up
and a curl -I http://{DOCKER_HOST}/holdings
as suggested on page 141, the curl
-call bails out with a AttributeError: module 'holdings.queries_cached' has no attribute 'Holdings'
.
I would expect it to trace the 3 calls tried.
I'm testing the example of cache method, but the request is always executed
`
import requests
import logging
from cachetools import cached, TTLCache
class MarketDataClient(object):
logger = logging.getLogger(__name__)
cache = TTLCache(maxsize=10, ttl=5*60)
base_url = 'http://market-data:8000'
def _make_request(self, url):
response = requests.get(
f"{self.base_url}/{url}", headers={'content-type': 'application/json'})
return response.json()
@cached(cache)
def all_prices(self):
MarketDataClient.logger.warning("Making request to get all_prices")
return self._make_request("prices")
def price(self, code):
return self._make_request(f"prices/{code}")
`
Here is the output of the containers:
holdings_1 | Making request to get all_prices
market-data_1 | [2019-01-05 15:23:20 +0000] [10] [DEBUG] GET /prices
market-data_1 | [2019-01-05 15:23:20 +0000] [10] [DEBUG] Closing connection.
holdings_1 | [2019-01-05 15:23:20 +0000] [10] [DEBUG] Closing connection.
holdings_1 | [2019-01-05 15:23:21 +0000] [10] [DEBUG] HEAD /holdings
holdings_1 | Making request to get all_prices
market-data_1 | [2019-01-05 15:23:21 +0000] [10] [DEBUG] GET /prices
market-data_1 | [2019-01-05 15:23:21 +0000] [10] [DEBUG] Closing connection.
holdings_1 | [2019-01-05 15:23:21 +0000] [10] [DEBUG] Closing connection.
holdings_1 | [2019-01-05 15:23:22 +0000] [10] [DEBUG] HEAD /holdings
holdings_1 | Making request to get all_prices
market-data_1 | [2019-01-05 15:23:22 +0000] [10] [DEBUG] GET /prices
market-data_1 | [2019-01-05 15:23:22 +0000] [10] [DEBUG] Closing connection.
holdings_1 | [2019-01-05 15:23:22 +0000] [10] [DEBUG] Closing connection.
Holdings is getting the request all the times. Any clue?
MacOS Mojave (version 10.14.3)
Docker Desktop Community (version 2.0.3.0)
Just go for example to chapter 7/feature
directory, and run docker-compose up --build
Errors of the form:
| self.subextensions.update(iter_extensions(bound))
simplebank-market | File "/usr/local/lib/python3.6/site-packages/nameko/extensions.py", line 358, in iter_extensions
simplebank-market | for item in iter_extensions(ext):
simplebank-market | File "/usr/local/lib/python3.6/site-packages/nameko/extensions.py", line 358, in iter_extensions
simplebank-market | for item in iter_extensions(ext):
simplebank-market | File "/usr/local/lib/python3.6/site-packages/nameko/extensions.py", line 357, in iter_extensions
simplebank-market | for _, ext in inspect.getmembers(extension, is_extension):
simplebank-market | File "/usr/local/lib/python3.6/inspect.py", line 342, in getmembers
simplebank-market | value = getattr(object, key)
simplebank-market | File "/usr/local/lib/python3.6/site-packages/kombu/utils/objects.py", line 44, in __get__
simplebank-market | value = obj.__dict__[self.__name__] = self.__get(obj)
simplebank-market | File "/usr/local/lib/python3.6/site-packages/kombu/mixins.py", line 247, in channel_errors
simplebank-market | return self.connection.channel_errors
simplebank-market | File "/usr/local/lib/python3.6/site-packages/nameko/messaging.py", line 361, in connection
simplebank-market | ssl=ssl
simplebank-market | File "/usr/local/lib/python3.6/site-packages/kombu/connection.py", line 189, in __init__
simplebank-market | url_params = parse_url(hostname)
simplebank-market | File "/usr/local/lib/python3.6/site-packages/kombu/utils/url.py", line 47, in parse_url
simplebank-market | scheme, host, port, user, password, path, query = _parse_url(url)
simplebank-market | File "/usr/local/lib/python3.6/site-packages/kombu/utils/url.py", line 81, in url_to_parts
simplebank-market | parts.port,
simplebank-market | File "/usr/local/lib/python3.6/urllib/parse.py", line 169, in port
simplebank-market | port = int(port, 10)
simplebank-market | ValueError: invalid literal for int() with base 10: 'localhost}:${RABBIT_PORT:5672}'
Looks like it is failing to resolve the environment variables.
But there are lots of other nameko related errors/deprecation notices etc too.
Trying to build the example using docker-compose up
fails on macOS 13, citing an error for a class uri 'gevent' invalid or not found.
I'm not sure if this is an error with the example or with my system, but if anyone has any clue as to what I can fix to get this to work I would be very grateful for the help.
Stack trace of the build:
+] Building 166.3s (16/16) FINISHED
=> [market-data internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 211B 0.0s
=> [market-data internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [holdings internal] load metadata for docker.io/library/python:3.6 2.6s
=> [market-data internal] load build context 0.0s
=> => transferring context: 1.58kB 0.0s
=> CACHED [holdings 1/4] FROM docker.io/library/python:3.6@sha256:f8652afaf88c25f0d22354d547d892591067aa4026a7fa9a6819df9f300af6fc 25.7s
=> => resolve docker.io/library/python:3.6@sha256:f8652afaf88c25f0d22354d547d892591067aa4026a7fa9a6819df9f300af6fc 0.0s
=> => sha256:ac9d381bd1e98fa8759f80ff42db63c8fce4ac9407b2e7c8e0f031ed9f96432b 5.14MB / 5.14MB 1.1s
=> => sha256:6b38ac662248fefa063a111bf2ad90812583c7295a6b912e563c969795a0e4d8 2.22kB / 2.22kB 0.0s
=> => sha256:8c1c1d9c1f7000f6d70c3c6f6e6e4af4b5be7093cf36664bc7782b47536b9ed9 9.29kB / 9.29kB 0.0s
=> => sha256:94a23d3cb5be24659b25f17537307e7f568d665244f6a383c1c6e51e31080749 53.60MB / 53.60MB 11.2s
=> => sha256:aa9c5b49b9db3dd2553e8ae6c2081b77274ec0a8b1f9903b0e5ac83900642098 10.66MB / 10.66MB 3.6s
=> => sha256:f8652afaf88c25f0d22354d547d892591067aa4026a7fa9a6819df9f300af6fc 1.86kB / 1.86kB 0.0s
=> => sha256:841dd868500b6685b6cda93c97ea76e817b427d7a10bf73e9d03356fac199ffd 54.67MB / 54.67MB 14.0s
=> => sha256:d4bb9078a4a2954fb77553c7f66912068fb62ff7cf431160389ebd36fab5c7ad 189.42MB / 189.42MB 20.3s
=> => extracting sha256:94a23d3cb5be24659b25f17537307e7f568d665244f6a383c1c6e51e31080749 1.9s
=> => sha256:9d807fc527df91778b94e6dc5530f98eadf6a309392e1b22ba7cf1cc0dbf9085 6.16MB / 6.16MB 14.6s
=> => extracting sha256:ac9d381bd1e98fa8759f80ff42db63c8fce4ac9407b2e7c8e0f031ed9f96432b 0.2s
=> => extracting sha256:aa9c5b49b9db3dd2553e8ae6c2081b77274ec0a8b1f9903b0e5ac83900642098 0.1s
=> => extracting sha256:841dd868500b6685b6cda93c97ea76e817b427d7a10bf73e9d03356fac199ffd 1.9s
=> => sha256:89008f573ea7a79b0e5be8ad88ed49f54d72a83cbd246dab36b9ab8fbf935df0 13.83MB / 13.83MB 17.2s
=> => sha256:fd06ee6262083cd07382e9861f06330a376cf1afb1301731a27716a33d0dbf31 233B / 233B 14.8s
=> => sha256:0e849fd7dce59e67c42d4a18a09c4ffb540be56628ecac88aad62269e08c2e84 2.21MB / 2.21MB 16.1s
=> => extracting sha256:d4bb9078a4a2954fb77553c7f66912068fb62ff7cf431160389ebd36fab5c7ad 4.4s
=> => extracting sha256:9d807fc527df91778b94e6dc5530f98eadf6a309392e1b22ba7cf1cc0dbf9085 0.2s
=> => extracting sha256:89008f573ea7a79b0e5be8ad88ed49f54d72a83cbd246dab36b9ab8fbf935df0 0.3s
=> => extracting sha256:fd06ee6262083cd07382e9861f06330a376cf1afb1301731a27716a33d0dbf31 0.0s
=> => extracting sha256:0e849fd7dce59e67c42d4a18a09c4ffb540be56628ecac88aad62269e08c2e84 0.2s
=> [market-data 2/4] ADD . /app 0.6s
=> [market-data 3/4] WORKDIR /app 0.0s
=> [market-data 4/4] RUN pip install -r requirements.txt 65.6s
=> [market-data] exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:375586c00184b260fe7a81a3f531fc6997d1692e8bd2f028fdf005d0a16b00b8 0.0s
=> => naming to docker.io/library/chapter-6-market-data 0.0s
=> [holdings internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [holdings internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 211B 0.0s
=> [holdings internal] load build context 0.0s
=> => transferring context: 3.94kB 0.0s
=> [holdings 2/4] ADD . /app 0.0s
=> [holdings 3/4] WORKDIR /app 0.0s
=> [holdings 4/4] RUN pip install -r requirements.txt 71.0s
=> [holdings] exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:7879e0144ebf68703be3e06c6bc6528d0f386404fc2478578f157abbeeb50659 0.0s
=> => naming to docker.io/library/chapter-6-holdings 0.0s
[+] Running 3/2
✔ Network chapter-6_default Created 0.0s
✔ Container chapter-6-market-data-1 Created 0.0s
✔ Container chapter-6-holdings-1 Created 0.0s
Attaching to chapter-6-holdings-1, chapter-6-market-data-1
chapter-6-market-data-1 |
chapter-6-market-data-1 | Error: class uri 'gevent' invalid or not found:
chapter-6-market-data-1 |
chapter-6-market-data-1 | [Traceback (most recent call last):
chapter-6-market-data-1 | File "/usr/local/lib/python3.6/site-packages/gunicorn/util.py", line 99, in load_class
chapter-6-market-data-1 | mod = importlib.import_module('.'.join(components))
chapter-6-market-data-1 | File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
chapter-6-market-data-1 | return _bootstrap._gcd_import(name[level:], package, level)
chapter-6-market-data-1 | File "<frozen importlib._bootstrap>", line 994, in _gcd_import
chapter-6-market-data-1 | File "<frozen importlib._bootstrap>", line 971, in _find_and_load
chapter-6-market-data-1 | File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
chapter-6-market-data-1 | File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
chapter-6-market-data-1 | File "<frozen importlib._bootstrap_external>", line 678, in exec_module
chapter-6-market-data-1 | File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
chapter-6-market-data-1 | File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/ggevent.py", line 14, in <module>
chapter-6-market-data-1 | import gevent
chapter-6-market-data-1 | File "/usr/local/lib/python3.6/site-packages/gevent/__init__.py", line 87, in <module>
chapter-6-market-data-1 | from gevent._hub_local import get_hub
chapter-6-market-data-1 | File "/usr/local/lib/python3.6/site-packages/gevent/_hub_local.py", line 101, in <module>
chapter-6-market-data-1 | import_c_accel(globals(), 'gevent.__hub_local')
chapter-6-market-data-1 | File "/usr/local/lib/python3.6/site-packages/gevent/_util.py", line 105, in import_c_accel
chapter-6-market-data-1 | mod = importlib.import_module(cname)
chapter-6-market-data-1 | File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
chapter-6-market-data-1 | return _bootstrap._gcd_import(name[level:], package, level)
chapter-6-market-data-1 | File "src/gevent/__greenlet_primitives.pxd", line 12, in init gevent.__hub_local
chapter-6-market-data-1 | ValueError: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 128 from C header, got 40 from PyObject
chapter-6-market-data-1 | ]
chapter-6-market-data-1 |
chapter-6-market-data-1 |
chapter-6-market-data-1 exited with code 1
chapter-6-holdings-1 |
chapter-6-holdings-1 | Error: class uri 'gevent' invalid or not found:
chapter-6-holdings-1 |
chapter-6-holdings-1 | [Traceback (most recent call last):
chapter-6-holdings-1 | File "/usr/local/lib/python3.6/site-packages/gunicorn/util.py", line 99, in load_class
chapter-6-holdings-1 | mod = importlib.import_module('.'.join(components))
chapter-6-holdings-1 | File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
chapter-6-holdings-1 | return _bootstrap._gcd_import(name[level:], package, level)
chapter-6-holdings-1 | File "<frozen importlib._bootstrap>", line 994, in _gcd_import
chapter-6-holdings-1 | File "<frozen importlib._bootstrap>", line 971, in _find_and_load
chapter-6-holdings-1 | File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
chapter-6-holdings-1 | File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
chapter-6-holdings-1 | File "<frozen importlib._bootstrap_external>", line 678, in exec_module
chapter-6-holdings-1 | File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
chapter-6-holdings-1 | File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/ggevent.py", line 14, in <module>
chapter-6-holdings-1 | import gevent
chapter-6-holdings-1 | File "/usr/local/lib/python3.6/site-packages/gevent/__init__.py", line 87, in <module>
chapter-6-holdings-1 | from gevent._hub_local import get_hub
chapter-6-holdings-1 | File "/usr/local/lib/python3.6/site-packages/gevent/_hub_local.py", line 101, in <module>
chapter-6-holdings-1 | import_c_accel(globals(), 'gevent.__hub_local')
chapter-6-holdings-1 | File "/usr/local/lib/python3.6/site-packages/gevent/_util.py", line 105, in import_c_accel
chapter-6-holdings-1 | mod = importlib.import_module(cname)
chapter-6-holdings-1 | File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
chapter-6-holdings-1 | return _bootstrap._gcd_import(name[level:], package, level)
chapter-6-holdings-1 | File "src/gevent/__greenlet_primitives.pxd", line 12, in init gevent.__hub_local
chapter-6-holdings-1 | ValueError: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 128 from C header, got 40 from PyObject
chapter-6-holdings-1 | ]
chapter-6-holdings-1 |
chapter-6-holdings-1 |
chapter-6-holdings-1 exited with code 1
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.